Python Socket(简单服务器脚本)

时间:2013-08-30 03:12:48

标签: python sockets

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

  1. 等待客户端连接
  2. 从客户端接收按摩,直至客户断开连接
  3. 客户端断开连接后,等待其他客户端连接
  4. 在客户断开连接之前接受按摩
  5. REPEAT ...

  6. 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
    

    我的问题是即使我在一台电脑上测试它时脚本似乎正在工作,我注意到它从客户端收到连接后,line no 7

    print "Connection established.. with ",address
    

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

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

    但为什么它变得反应迟钝? 为了使事情更清楚,

    - 脚本运行正常(它接收数据并从屏幕打印出来并等待客户端断开连接时的新连接)

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

有关阻止和非阻止呼叫的说明,请参阅this链接。您也可以参考this问题来了解如何在Python中实现非阻塞套接字 - 当然也有大量的Web资源。

希望这有帮助