0

这个程序应该做的就是同时接受来自 2 个客户端的输入并将它们打印出来,但是它接受来自第一个客户端的 1 个输入进行连接,然后开始无限地接受来自第二个客户端的输入,但不再接受来自第一个客户端的输入。有关如何修复此代码的任何提示?(如下图)

import socket
import select
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("127.0.0.1", 4000))
s.listen(5)
sockets = []
sockets.append(s)
while True:
    (read, write, err) = select.select(sockets, [], [])
    for socket in read:
        if (socket == s):
            (c, a) = socket.accept()
            sockets.append(c)
            print ("Received connection from: ", a)
    message = c.recv(80).decode()
    print (message + " from " + str(a[1]))
4

1 回答 1

1

只有在数据可用时才需要从客户端接收数据以防止阻塞。

message = c.recv(80).decode()

上面那行是随便读的;它只会从最后一个接受的客户端读取。

这是for循环的修改版本:

for peer in read:
    if peer == s:
        (c, a) = peer.accept()
        sockets.append(c)
        print("Received connection from:", a)
    else:
        # Receive data from client only if data is available
        message = peer.recv(80).decode()
        if message:
            print(message, "from", peer.getpeername())
        else:
            # No message to read => clinet disconnection
            print(peer.getpeername(), "disconnected")
            sockets.remove(peer)

我重命名socketpeer防止名称隐藏;用作socket变量名将隐藏socket模块引用。

于 2016-11-19T03:48:18.167 回答