我從Python檔案這里改編了下面的代碼。
# filename: example.py。
from datetime import datetime
import socket
import socketserver
import sys
import threading
import time
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler)。
def handle(self)。
data = str(self.request.recv(1024), 'ascii')
cur_thread = threading.current_thread()
response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
self.request.sendall(response)
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer)。
allow_reuse_address = True[/span]。
def client(ip, port, message) 。
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((ip, port))
sock.sendall(bytes(message, 'ascii')
response = str(sock.recv(1024), 'ascii')
print("Received: {}".format(response))
if __name__ == "__main__"/span>。
HOST, PORT = "127.0.0.1", 9999.
if sys.argv[1] == "server":
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
with server:
ip, port = server.server_address
print(f'{ip} {port}'/span>)
server_thread = threading.Thread(target=server.serve_forever)
server_thread.start()
#這些作業。
client(ip, port, "Hello World 1 at " str(datetime.now() ) )
time.sleep(1)
client(ip, port, "Hello World 2 at " str(datetime.now() ))
time.sleep(2)
client(ip, port, "Hello World 3 at " str(datetime.now() ))
if sys.argv[1] == "client":
# 這些不起作用,為什么?
client(HOST, PORT, "Hello World 1 at " str(datetime.now()) )
time.sleep(1)
client(HOST, PORT, "Hello World 2 at " str(datetime.now() ))
time.sleep(2)
client(HOST, PORT, "Hello World 3 at " str(datetime.now() ))
在服務器上運行這段代碼,可以達到預期效果:
$ python3 example.py server
127.0.0.1 9999
收到了。Thread-2: Hello World 1 at 2021-09-14 20:02:25.135218
收到。Thread-3: Hello World 2 at 2021-09-14 20:02:26.140889
收到。Thread-4: Hello World 3 at 2021-09-14 20:02:28.143664
我讓這個終端標簽運行(程式正在等待其他客戶的連接),打開一個新的標簽并運行以下內容,但它產生了一個錯誤:
$ python3 example.py client
回溯(最近一次呼叫)。
檔案 "/Users/ashroyer-admin/repo/phd-courses/2021-F-cloudcomp/thred.py", line 45, in <module>
client(HOST, PORT, "Hello World 1 at " str(datetime.now() ))
檔案 "/Users/ashroyer-admin/repo/phd-courses/2021-F-cloudcomp/thred.py", 20行, in client
sock.connect((ip, port))
ConnectionRefusedError: [Errno 61] 連接拒絕
uj5u.com熱心網友回復:
ConnectionRefused通常意味著在指定的IP/埠沒有服務器在監聽(或者它的積壓已滿,在這個例子中不太可能)。 有可能的是,當你試圖連接其他終端客戶時,server物件根本就沒有再運行。 僅僅因為你將服務器的終端打開,并不意味著服務器本身仍在該終端中運行。
服務器很可能在其主執行緒對client()進行了3次呼叫后終止了。 你正在另一個執行緒中運行serve_forever(),而不是在創建server并呼叫client()的主執行緒中。 之后沒有任何東西--沒有回圈、沒有事件等--代碼在等待,以保持腳本的運行,這樣server_thread就可以繼續為新客戶提供服務。
當with server:塊結束時,server物件被關閉。 而當主執行緒完成后,腳本就退出了。
我的建議是:
完全擺脫
server_thread和對client()的三次呼叫。只要在print(f'{ip} {port}')之后呼叫server.service_forever(),然后使用其他終端來測驗你的client()代碼。或者,至少洗掉
with server:塊。顯然,"服務器執行緒不是守護神,所以當main退出時它會繼續運行。洗掉with server:就可以正常作業了。" (thanks
) @MarkTolonen)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311822.html
標籤:
上一篇:你能對一組復選框進行模糊處理嗎?
下一篇:簡單的雙向插座通信
