1

我有这个简单的服务器脚本。我对这个脚本的目标是:

  1. 等待客户端连接
  2. 接收来自客户端的按摩,直到客户端断开连接
  3. 一旦客户端断开连接,等待另一个客户端连接
  4. 接收按摩直到客户端断开连接
  5. 重复...

import socket

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",5000))
server_socket.listen(5)
print "Awaiting Client connection"
client_socket, address =server_socket.accept()
print "Connection established.. with ",address
while True:
    data=client_socket.recv(512)
    if not data:
        client_socket.close()
        print "Client disconnected, Awaiting new connections..."
        client_socket, address =server_socket.accept()
        print "Connection from ",address
    else:
        print "RECIEVED:",data

我的问题是,即使当我在一对 pc 上测试它时脚本似乎正在工作,我注意到它在收到来自客户端的连接后,即 line no 7

print "Connection established.. with ",address

在客户端发送任何消息之前,python shell 窗口似乎没有响应(如果我尝试移动 shell 窗口则没有响应)。

据我了解,如果没有来自客户端的传入消息,client_socket.recv(512)则只会等待来自客户端的数据。

但是为什么它变得没有反应?为了让事情更清楚,

-脚本工作得很好(它接收数据并从屏幕上打印出来,如果客户端断开连接,则等待新连接)

- 控制台窗口中的光标停止闪烁

- 当我尝试移动控制台窗口时,它变得无响应并且窗口给我一条消息“该程序已停止响应”

4

1 回答 1

1

accept基本上,您在此行之后的调用中编写块:

print "Client disconnected, Awaiting new connections..."

accept仅当特定客户端尝试连接到服务器时,调用才会返回。那是您的脚本将继续执行到下一行的时间。这就是您会在 Windows 中看到类似此程序没有响应的消息的原因。

您可以考虑使用非阻塞套接字 I/O 方法以确保您的脚本是响应式的。

有关阻塞和非阻塞调用的说明,请参阅此链接。您也可以参考这个问题来了解如何在 Python 中实现非阻塞套接字——当然也有大量的网络资源。

希望这可以帮助

于 2013-08-30T04:29:01.913 回答