0

有没有办法停止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") 

回答

2

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() 

您接受主循环中的连接,然后将客户端详细信息传递给线程进行处理。

+0

线程部分不工作,但阻挡呼叫完美,谢谢 – Racerider

+0

@Racerider很高兴我能帮上忙。我在这里写的代码是一个有代表性的例子。有几个补充它应该工作。祝一切顺利。 –