Python Socket(简单服务器脚本)

标签 python sockets

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

  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
<小时/>

我的问题是,尽管当我在一对电脑上测试该脚本时似乎可以正常工作,但我注意到在它收到来自客户端的连接后,即第 7 行

print "Connection established.. with ",address

Python shell 窗口似乎没有响应(如果我尝试移动 shell 窗口,就会变得没有响应),直到客户端发送任何消息。

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

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

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

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

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

最佳答案

基本上,您可以在该行之后出现的 accept 调用上编写脚本 block :

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

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

您可以考虑使用非阻塞套接字 I/O 方法,以确保您的脚本具有响应能力。

引用this阻塞和非阻塞调用描述的链接。也可以引用this了解如何在 Python 中实现非阻塞套接字的问题 - 当然也有大量的网络资源。

希望这有帮助

关于Python Socket(简单服务器脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18524311/

相关文章:

python - 在 python 中处理 SOAP 类型异常的最佳方法是什么

python - 在 Python 中加入 2 个不同大小的列表

python - 如何使用 matplotlib 绘制没有颜色的网格混淆矩阵?

python - Seaborn 条形图图例标签失去颜色

c - 绑定(bind)失败 : Cannot assign requested address

javascript - 如何浏览器需要 ('net' ).Socket?

python - 使用 BeautifulSoup 抓取具有多个页面的表

c++ - iOS 上的 TCP 流不显示在无线网络上

python - 如何使用 PIR 传感器将信息从客户端发送到服务器端 [WinError 10057]

sockets - so_reuseaddr相关的问题