Python 服务器停止显示消息,但在客户端关闭时垃圾邮件
我用Python制作了一个简单的客户机-服务器应用程序,但是在收到来自客户机的3条消息后,服务器就停止显示它们。当客户端关闭连接时,服务器会垃圾邮件发送空输入。有人能告诉我为什么吗 Server.pyPython 服务器停止显示消息,但在客户端关闭时垃圾邮件,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_
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,这意味着没有超时,因此调用将无限期地阻塞。