我有以下代碼在 Python 中處理套接字:
import socket
HOST = "127.0.0.1"
PORT = 4999
TIMEOUT = 1
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT)) #
s.listen()
conn, addr = s.accept()
conn.settimeout(TIMEOUT)
with conn:
print(f"Connected by {addr}")
while True:
recieved = conn.recv(1024)
print(recieved)
我打開一個終端并使用python3 server.py. 它可以作業,但是當第一個連接關閉時,我的腳本就結束了。我希望能夠處理多個連接。換句話說,當第一個連接關閉時,我想等待第二個,第三個連接等。
我嘗試用threading. 見下文:
import socket
import threading
HOST = "127.0.0.1"
PORT = 4999
TIMEOUT = 1
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT)) #
s.listen()
conn, addr = s.accept()
conn.settimeout(TIMEOUT)
threading.Lock()
with conn:
print(f"Connected by {addr}")
while True:
recieved = conn.recv(1024)
print(recieved)
但情況是一樣的。請問我做錯了什么?
uj5u.com熱心網友回復:
像這樣的東西:
主執行緒接收資料并追加到串列。執行緒監視器串列資料可以做任何事情。
def receive_tcp_packets(self):
server_socket.bind(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.listen()
server_conn, address = server_socket.accept()
# Wait for connection
with server_conn:
print("Connected by {}".format(str(address)))
# Wait to receive data
while True:
data = server_conn.recv(self.packet_size)
# Just keep appending the data
self.recv_data.append(data)
if not data:
break
# Close connection
server_socket.close()
def run_server(self):
while True:
self.receive_tcp_packets()
# Run the function that process incoming data
thread = threading.Thread(target=check_for_data, args = (xxx))
thread.start
# Run the main function that waits for incoming data
server_socket.run_server()
uj5u.com熱心網友回復:
您不需要執行緒來處理串行連接,并且您的“帶執行緒”示例根本沒有使用執行緒。它只是創建(并沒有保存)一個threading.Lock物件。使用while回圈接受下一個連接:
import socket
HOST = ''
PORT = 4999
with socket.socket() as s:
s.bind((HOST, PORT))
s.listen()
while True:
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
while True:
received = conn.recv(1024)
if not received: break # connection was closed
print(received)
print(f"Disconnected by {addr}")
手動 2 客戶端演示:
>>> from socket import *
>>> s=socket()
>>> s.connect(('localhost',4999))
>>> s.sendall(b'hello')
>>> s.close()
>>> s=socket()
>>> s.connect(('localhost',4999))
>>> s.sendall(b'goodbye')
>>> s.close()
服務器輸出:
Connected by ('127.0.0.1', 19639)
b'hello'
Disconnected by ('127.0.0.1', 19639)
Connected by ('127.0.0.1', 19640)
b'goodbye'
Disconnected by ('127.0.0.1', 19640)
如果您需要并行連接,請為每個連接啟動一個執行緒:
import socket
import threading
HOST = '' # typically listen on any interface on the server. "127.0.0.1" will only accept connections on the *same* computer.
PORT = 4999
def handler(conn,addr):
with conn:
print(f"Connected by {addr}")
while True:
received = conn.recv(1024)
if not received: break # connection was closed
print(f'{addr}: {received}')
print(f"Disconnected by {addr}")
with socket.socket() as s:
s.bind((HOST, PORT))
s.listen()
while True:
conn, addr = s.accept()
threading.Thread(target=handler, args=(conn,addr)).start()
2個客戶端同時連接的手動演示:
>>> from socket import *
>>> s=socket()
>>> s.connect(('localhost',4999))
>>> s2=socket()
>>> s2.connect(('localhost',4999))
>>> s.sendall(b'hello')
>>> s2.sendall(b'goodbye')
>>> s.close()
>>> s2.close()
服務器輸出:
Connected by ('127.0.0.1', 19650)
Connected by ('127.0.0.1', 19651)
('127.0.0.1', 19650): b'hello'
('127.0.0.1', 19651): b'goodbye'
Disconnected by ('127.0.0.1', 19650)
Disconnected by ('127.0.0.1', 19651)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488408.html
