我使用socket编写了一个基本的Python聊天脚本。它正在发挥作用,但并不像我希望的那样。
当client1发送msg时,只有在client2发送msg之后,client2才会获得client1的msg,等等。
我知道有一个名为mscvrt
的库可以帮助我,但我不知道如何使用它(有点新的。我也知道我应该让接收方法不阻塞通过选择库。
如何以不阻塞的方式使用输入和recv?
这是服务器代码:
import socket
import select
server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 23))
server_socket.listen(5)
open_client_sockets = []
messages_to_send = []
def send_waiting_messages(wlist):
for message in messages_to_send:
(client_socket1, data) = message
for new_socket in open_client_sockets:
if new_socket in wlist:
if new_socket is not client_socket1:
new_socket.send(data)
print 'msg sent'
messages_to_send.remove(message)
while True:
rlist, wlist, xlist = select.select([server_socket] + open_client_sockets, open_client_sockets, [])
for current_socket in rlist:
if current_socket is server_socket:
(new_socket, address) = server_socket.accept()
open_client_sockets.append(new_socket)
else:
data = current_socket.recv(1024)
if data is not "":
messages_to_send.append((current_socket, data))
send_waiting_messages(wlist)
这是客户端代码(非常基本):
import socket
import select
my_socket = socket.socket()
my_socket = socket.socket()
my_socket.connect(('127.0.0.1', 23))
print('Welcome to the chat room . You can send messages here.')
print('Choose a nickname.')
nickname = raw_input()
while True:
txt = raw_input()
my_socket.send('[' + nickname + ']: ' + txt)
print (my_socket.recv(1024))
答案 0 :(得分:0)
您的recv仅在您发送之后。你应该在单独的线程中创建它们,否则他将始终发送,然后才接收。 在客户端和服务器中,使用threading module进行异步聊天。
此问题已在here和许多其他问题中得到解答。 祝你好运。