Python 服务器停止显示消息,但在客户端关闭时垃圾邮件

Python 服务器停止显示消息,但在客户端关闭时垃圾邮件,python,client-server,Python,Client Server,我用Python制作了一个简单的客户机-服务器应用程序,但是在收到来自客户机的3条消息后,服务器就停止显示它们。当客户端关闭连接时,服务器会垃圾邮件发送空输入。有人能告诉我为什么吗 Server.py import socket import threading bind_ip = "127.0.0.1" bind_port = 4443 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((bind_

我用Python制作了一个简单的客户机-服务器应用程序,但是在收到来自客户机的3条消息后,服务器就停止显示它们。当客户端关闭连接时,服务器会垃圾邮件发送空输入。有人能告诉我为什么吗

Server.py

import socket
import threading

bind_ip = "127.0.0.1"
bind_port = 4443

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(10)

print "[*] Listening on %s:%d" % (bind_ip, bind_port)

# Ths is our thread for handling clients
def handle_client(client_socket, address):
    running = True
    while running:
        # Print out what the client sends to us.
        request = client_socket.recv(1024)
        print "[*] Data received from %s: %s " % (address[0], request)

        if request == 'shutdown':
            running = False

    client_socket.send("Closing server. Bye.")
    client_socket.close()
    print 'Server not available for new connections.'

while True:
    client, addr = server.accept()
    print '[*] Accepted incoming connection from: %s:%d' %  
    (addr[0],addr[1])
    client.send("You're now connected! Enjoy.")

    # Spin up our client thread to handle incoming data
    client_handler = threading.Thread(target=handle_client, args=(client, 
    addr))
client_handler.start()
Client.py

import socket

target_host = "127.0.0.1"
target_port = 4443

# Create a socket object
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the client
client.connect((target_host, target_port))

while True:
    # Read some input from the keyboard
    msg = raw_input()

    client.send(msg)

    # Receive some data
    response = client.recv(1024)

    print response

客户端冻结,因为服务器只响应一次数据:您现在已连接!享受它堵住了

# Receive some data
response = client.recv(1024)
您可以通过在单独的线程中打印服务器响应来解决此问题:

import socket

target_host = "127.0.0.1"
target_port = 4443

# Create a socket object
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the client
client.connect((target_host, target_port))


def handle_server(client):
    while True:
        print(client.recv(1024))

while True:
    # Read some input from the keyboard
    msg = input('Input:')

    client.send(msg)

    # Receive some data
    import threading
    server_handler = threading.Thread(target=handle_server, args=(client,))
    server_handler.start()

谢谢你能解释一下它为什么会阻塞吗?顺便说一句,您的解决方案很有魅力:其他文档都有完整的细节-。简言之,默认情况下,套接字是在阻塞模式下创建的:在阻塞模式下,操作阻塞直到完成或系统返回错误。因此,当您调用client.recv1024时,客户机会耐心地等待下一个数据块,在这个设置中,下一个数据块永远不会出现。套接字的默认超时为None,这意味着没有超时,因此调用将无限期地阻塞。