嗨,我有一个练习要使用套接字选择和 msvcrt(顺便说一句,使用 python 2.7)、mltiplie 聊天的服务器和客户端(意味着服务器和客户端需要非阻塞地构建),每个客户端都将发送消息和服务器会将消息发送给除了发送消息的所有客户端,这是服务器:
import socket
import select
IP = "192.168.1.154"
port = 123
default_buffer_size = 1024
open_client_sockets = []
messages_to_send = []
def send_waiting_messages(wlist):
for message in messages_to_send:
(client_sock, data) = message
if client_sock in wlist:
for sock in open_client_sockets:
if sock is not client_sock:
sock.send(data)
messages_to_send.remove(message)
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((IP, port))
sock.listen(5)
print("The server is on and waiting for client...")
while True:
rlist, wlist, xlist = select.select([sock] + open_client_sockets, open_client_sockets, [])
for current_socket in rlist:
if current_socket is sock:
(new_socket, addr) = sock.accept()
open_client_sockets.append(new_socket)
else:
data = current_socket.recv(default_buffer_size)
if data == "":
open_client_sockets.remove(current_socket)
print("Connection with client closed")
else:
messages_to_send.append((current_socket, 'Hello ' + data))
send_waiting_messages(wlist)
if __name__ == '__main__':
main()
构建服务器并不难,因为它是由本书指导的(如果没有指导,我永远不会让这段代码工作),但我在构建客户端时遇到问题,主要原因是我不明白
select.select
有效,找不到可以为我简化这个模块的答案。这就是我对客户所做的:
import socket
import select
import msvcrt
IP = "192.168.1.154"
port = 123
sockets = []
def write():
pass
def main():
sock = socket.socket()
sock.connect((IP, port))
while True:
rlist, wlist, xlist = select.select(sockets, sockets, [])
for current_socket in rlist:
if current_socket is sock:
data = current_socket.recv(1024)
print(data)
else:
sockets.append(current_socket)
write()
if __name__ == '__main__':
main()
这可能表明我实际上对模块选择和练习的了解不足。我看到一些有类似问题的线程,但我对它们一无所知,所以我真的需要很好的解释。
总之,我真的迷路了......
最佳答案
select
需要(在 Windows 上)至少一个“等待对象”的非空列表,因此使用 sockets = []
它不能工作。设置 sockets = [sock]
在 sock = socket.socket()
之后.
有关简单但完整的示例,请参见 answer to "Handle multiple requests with select" .
关于python-2.7 - Python(2.7)使用套接字和选择模块进行多重聊天(非阻塞代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345101/