【问题标题】:Python socket wait for client connectionPython套接字等待客户端连接
【发布时间】:2017-12-10 14:20:20
【问题描述】:

有没有办法在客户端连接到该服务器之前停止 while 循环? 服务器应该为每个新的客户端连接创建一个新线程,有可能吗?

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

【问题讨论】:

    标签: python multithreading python-3.x sockets python-multithreading


    【解决方案1】:

    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 很高兴我能帮上忙。我这里写的代码就是一个有代表性的例子。加上几个补充,它应该可以工作。一切顺利。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2015-02-08
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2013-12-15
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多