我在尝试构建聊天的客户端时遇到了问题。我刚开始,这是我的代码:
import socket
my_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
my_socket.connect(("10.10.10.69",1234))
while True:
message=raw_input("your message: ")
if(message=="quit"):
my_socket.close()
break
my_socket.send(message)
data=my_socket.recv(1024)
print "message from server:" , data
问题是raw_input
。当用户发送消息时,其他用户会堆叠在raw_input
上,所以只有当他们发送消息时才会收到新消息。
如何修复它(不使用线程)?
答案 0 :(得分:3)
正如我评论的那样,如果你的聊天客户端在Unix上运行,请使用select.select
。
例如:
import socket
import sys
import select
my_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
my_socket.connect(("10.10.10.69",1234))
sys.stdout.write('your message: ')
sys.stdout.flush()
while True:
r, w, x = select.select([sys.stdin, my_socket], [], [])
if not r:
continue
if r[0] is sys.stdin:
message = raw_input()
if message == "quit":
my_socket.close()
break
my_socket.send(message)
sys.stdout.write('your message: ')
sys.stdout.flush()
else:
data = my_socket.recv(1024)
print "message from server:" , data
答案 1 :(得分:2)
raw_input
支持它所在的线程,因此您无法在等待它的同一线程中检索消息。因此,我建议使用2个线程,一个接收新消息(比如每十秒),另一个发送消息(使用类似于现有代码的代码)。
如果你没有致力于raw_input
并且真的反对线程,你可能想要查看select module。
答案 2 :(得分:1)