我的python基本套接字聊天有一些问题

时间:2017-05-31 19:19:53

标签: python sockets chat

我使用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))

1 个答案:

答案 0 :(得分:0)

您的recv仅在您发送之后。你应该在单独的线程中创建它们,否则他将始终发送,然后才接收。 在客户端和服务器中,使用threading module进行异步聊天。

此问题已在here和许多其他问题中得到解答。 祝你好运。