我需要一些帮助。我有一个简单的服务器:
host="localhost"
port=4447
from socket import *
import thread
def func():
while 1:
data = conn.recv(1024)
if not data:
continue
else:
print("%s said: %s")%(player, data)
conn.close()
s=socket(AF_INET, SOCK_STREAM)
s.bind((host,port))
s.listen(2)
print("Waiting for clients on localhost, port %s")%port
while 1:
conn, addr = s.accept()
player = addr[1]
print(conn)
thread.start_new_thread(func,())
一个简单的客户:
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 4447
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
while 1:
data = raw_input("Input: ")
s.send(data)
因此,当我连接到服务器时,我可以输入任何内容,然后将其打印在服务器的终端中。当我打开另一个终端并启动第二个客户端时,我也可以输入任何内容并将其发送到服务器,但当我回到第一个客户端的终端并输入多个消息时,它会返回:
Traceback (most recent call last):
File "Client.py", line 18, in <module>
s.send(data)
socket.error: [Errno 32] Broken pipe
所以我通过在conn
中添加func()
作为参数来修复此问题,但我不明白为什么会发生此错误?有人可以向我解释一下吗?
谢谢!
答案 0 :(得分:0)
您的func
除了需要更好的名称外,还会在程序中使用全局状态与客户端进行通信。无论您开始处理客户端连接多少线程,仍然只有一个全局conn
变量。每次新客户端连接时,主线程循环都会将conn
重新绑定到新连接。抛弃旧套接字并由Python运行时自动关闭。
您可以通过删除使用全局变量来跟踪每个连接状态来解决此问题。不过,更好的探索途径是Twisted。