我正在尝试实现一个具有多个客户端连接的集中式服务器。应该保持连接正常。
到目前为止,我已经尝试了使用线程的多个客户端,但是当套接字与客户端“繁忙”时,另一个客户端无法在该套接字中连接。
此代码表示服务器脚本:
import socket
import threading
HOST = '127.0.0.1'
PORT = 54321
def request_handler(conn, addr):
with conn:
print(conn, addr)
while True:
data = conn.recv(1024)
print(data.decode('utf-8'))
if not data:
break
conn.sendall(data)
def main():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
while True:
conn, addr = s.accept()
print('Connected with', addr[0], ':', str(addr[1]))
t = threading.Thread(target=request_handler(conn, addr), daemon=True)
t.start()
if __name__ == '__main__':
main()此代码表示客户端部分:
import socket
host = '127.0.0.1'
port = 54321
def main():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
while True:
data = input('Type data: ')
if not data:
break
s.send(str.encode(data))
res = s.recv(1024)
print('Server Response:', res.decode('utf-8'))
if __name__ == '__main__':
main()客户端可以写入许多消息,并且连接保持打开,但是如果我使用另一个客户端,则在第一个客户端关闭连接之前,该客户端无法与服务器连接。
但是我想要的是第二个客户端可以和第一个客户端做同样的事情,以此类推。怎么做?
除了创建多个端口之外,还有其他解决方案吗?
更新
我已经使用_thread.start_new_thread修改了服务器脚本,现在它可以工作了。但我不明白为什么。
改性server.py
import socket
from _thread import start_new_thread
HOST = '127.0.0.1'
PORT = 54321
def request_handler(conn, addr):
with conn:
print(conn, addr)
while True:
data = conn.recv(1024)
print(data.decode('utf-8'))
if not data:
break
conn.sendall(data)
def main():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
while True:
conn, addr = s.accept()
print('Connected with', addr[0], ':', str(addr[1]))
start_new_thread(request_handler, (conn, addr))
if __name__ == '__main__':
main()总之,使用start_new_thread(request_handler, (conn, addr)),第二个客户端可以连接到服务器,并发送消息;使用threading.Thread(target=request_handler(conn, addr)).start(),它不会连接到服务器,但不会引发错误。
当我使用threading.Thread.start()时,主要步骤是等待#1客户端线程被停止,所以它是透明的,没有启动#2客户端线程;相反,_thread.start_new_thread()工作得很好。但是threading.Thread.start()实现了_thread.start_new_thread,所以这里发生了什么?
发布于 2022-03-08 14:39:41
解决后,我错误地使用了threading.Thread构造函数:
构造函数正在调用request_handler,而不是引用它。
因此,与其:
t= threading.Thread(target=request_handler(conn,addr))
正确的方法是:
t= threading.Thread(target=request_handler,args=(conn,addr))
这样线程就可以并行运行。
https://stackoverflow.com/questions/71383380
复制相似问题