Python 2.7 Python(2.7)使用套接字和选择模块(非阻塞代码)进行乘法聊天
您好,我有一个练习要使用sockets select和msvcrt(顺便说一句,使用python 2.7)、mltiplie chat的服务器和客户端(意味着服务器和客户端需要以非阻塞方式构建)构建,每个客户端都将发送消息,服务器将向所有客户端发送消息,但发送消息的客户端除外,这是服务器:Python 2.7 Python(2.7)使用套接字和选择模块(非阻塞代码)进行乘法聊天,python-2.7,sockets,select,Python 2.7,Sockets,Select,您好,我有一个练习要使用sockets select和msvcrt(顺便说一句,使用python 2.7)、mltiplie chat的服务器和客户端(意味着服务器和客户端需要以非阻塞方式构建)构建,每个客户端都将发送消息,服务器将向所有客户端发送消息,但发送消息的客户端除外,这是服务器: import socket import select IP = "192.168.1.154" port = 123 default_buffer_size = 1024 open_client_soc
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()
这可能表明我对模块选择和练习的理解程度较低。我看到一些线程有类似的问题,但我什么也不懂,所以我真的需要很好的解释。
总之,我真的迷路了…需要(在Windows上)至少一个非空的“可等待对象”列表,因此使用sockets=[]
它无法工作。在sock=socket.socket()之后设置sockets=[sock]
有关一个简单但完整的示例,请参见此