繁体   English   中英

如何在 Python 中使用套接字处理多线程?

[英]How to handle multithreading with sockets in Python?

我目前正在解决一个问题,我需要一个服务器同时处理多个客户端。 我有一个 server.py 文件和一个 client.py 文件。 这是 server.py 中的一个片段:

connections = []
addresses = []

for c in connections:
    c.close()
del connections[:]
del addresses[:]  #clears anything pre-existing

while True:
    try:
        csock, address = s.accept() #takes in connection and stores info
        s.setblocking(1) #prevents timeout
        connections.append(csock)
        addresses.append(address)
        print(f"Connection from {address} has been established!")
    except:
           print("Error has occurred")


当我在终端中运行我的服务器然后使用客户端连接到它时。 它的行为符合我的预期,打印出Connection from ('192.168.1.84', 50824) has been established! .

当我打开另一个终端并运行 client.py 以建立额外的连接时,没有任何反应。 也就是说,直到我关闭我的第一个客户端进程,然后服务器打印出来

Error occurred
Connection from ('192.168.1.84', 50826) has been established!

我可以看到这里发生了什么,但是我对网络很陌生,而且我在多线程方面不是很擅长,所以任何人都可以给我一些关于正在发生的事情以及我可以做些什么来使这些进程运行的见解同时如我所料?

s.accept()您应该使用threading在分离的线程中运行代码 - 该线程应该继续与客户端连接。 同时主线程可能会回到s.accept()等待下一个客户端。


带有一些额外设置的最少工作代码。

服务器:

import socket
import threading
import time

# --- functions ---

def handle_client(conn, addr):
    print("[thread] starting")

    # recv message
    message = conn.recv(1024)
    message = message.decode()
    print("[thread] client:", addr, 'recv:', message)
    
    # simulate longer work
    time.sleep(5)

    # send answer
    message = "Bye!"
    message = message.encode()
    conn.send(message)
    print("[thread] client:", addr, 'send:', message)
    
    conn.close()

    print("[thread] ending")
   
# --- main ---

host = '0.0.0.0'
port = 8080

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # solution for "[Error 89] Address already in use". Use before bind()
s.bind((host, port))
s.listen(1)

all_threads = []

try:
    while True:
        print("Waiting for client")
        conn, addr = s.accept()
    
        print("Client:", addr)
        
        t = threading.Thread(target=handle_client, args=(conn, addr))
        t.start()
    
        all_threads.append(t)
except KeyboardInterrupt:
    print("Stopped by Ctrl+C")
finally:
    if s:
        s.close()
    for t in all_threads:
        t.join()
    

客户端(用于测试)

import socket

# --- main ---

host = '0.0.0.0'
port = 8080

s = socket.socket()
s.connect((host, port))

print("Connected to the server")

message = "Hello"
print('send:', message)
message = message.encode()
s.send(message)

message = s.recv(1024)
message = message.decode()
print('recv:', message)
    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM