Python套接字等待客户端连接
问题描述:
有没有办法停止while循环,直到客户端连接到此服务器? 服务器shuld为每个新客户端连接创建一个新线程,这有可能吗?Python套接字等待客户端连接
import socket
import threading
def clientdialog(myS):
conn, addr = myS.accept()
print ("Connection from: " + str(addr))
while 1:
data = conn.recv(1024).decode("utf-8")
if not data or data == 'q':
break
print ("from connected user: " + str(data))
host = "192.168.1.3"
port = 1998
mySocket = socket.socket()
mySocket.bind((host,port))
while True:
mySocket.listen(10)
#whait until socket don't connect
try:
threading._start_new_thread(clientdialog, (mySocket))
except:
print("error starting thread")
答
socket.listen
函数被调用一次,因为它设置了连接队列的大小。
另一个称为socket.accept
的函数会阻塞直到建立连接。修改您的代码是这样的:
mySocket = socket.socket()
mySocket.bind((host,port))
mySocket.listen(10)
while True:
client_socket, client_address = mySocket.accept() # blocking call
.... # do something with the connection
欲了解更多信息,请访问docs。
此外,您希望将客户端套接字的详细信息传递给该线程。服务器套接字不是必需的。实际上,如下所示:
def handle_client(client_socket, client_address):
.... # do something with client socket
client_socket.close()
...
while True:
client_socket, client_address = mySocket.accept()
T = threading.Thread(target=handle_client, args=(client_socket, client_address))
T.start()
您接受主循环中的连接,然后将客户端详细信息传递给线程进行处理。
线程部分不工作,但阻挡呼叫完美,谢谢 – Racerider
@Racerider很高兴我能帮上忙。我在这里写的代码是一个有代表性的例子。有几个补充它应该工作。祝一切顺利。 –