簡體   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