使用 socket_server 建立一個簡單的伺服器和客戶端
阿新 • • 發佈:2021-08-29
使用 socket_server 建立一個簡單的伺服器和客戶端
建立TCP伺服器
# StreamRequestHandler: 支援操作檔案物件那樣話操作輸入輸出套接字 # 使用 readline() 獲取客戶訊息 # 使用 write() 把字串發給客戶端 from socketserver import TCPServer as TCP, StreamRequestHandler as SRH from time import ctime HOST = '' PORT = 21569 ADDR = (HOST, PORT) class MyRequestHandle(SRH):# 再有客戶端訊息進來的時候, handle 方法就會被呼叫 def handle(self): '''重寫handle方法''' print(f'...連線地址: {self.client_address}') self.wfile.write(f'[{ctime()}] {self.rfile.readline()}'.encode()) tcp_serv = TCP(ADDR, MyRequestHandle) print('等待連線...') tcp_serv.serve_forever()
建立TCP客戶端
# 建立一個TCP客戶端, 程式會提示使用者輸入要傳給伺服器的資訊, 顯示伺服器返回的加了時間戳的結果from socket import * # HOST 和 PORT 表示伺服器的主機名與埠號, 由於這裡是在一臺電腦執行, 所以 HOST 裡放的是 localhost # 如果伺服器和客戶端不在一臺電腦上, HOST要做出相應的修改 # 埠號和伺服器的設定完全相同 HOST = 'localhost' # HOST 變數為空, 表示 bind() 函式可以繫結到所有的有效地址上 PORT = 21569 # 設定埠號 BUFSIZ = 1024 # 設定緩衝區大小為1K ADDR = (HOST, PORT) while True: # socket_server 的請求處理器預設行為是接受連線, 得到請求, 然後關閉連線# 所以這裡每次都要建立新的套接字連線, 有點像UDP。不過這種行為也可以通過重寫請求處理器中相應的函式來改變 tcp_cli_sock = socket(AF_INET, SOCK_STREAM) tcp_cli_sock.connect(ADDR) data = input('>>>>>>請輸入內容: ') if not data: break tcp_cli_sock.send(f'{data}\r\n'.encode()) data = tcp_cli_sock.recv(BUFSIZ) if not data: break print(f'>>>>>客戶端data: {data}') tcp_cli_sock.close()
TCP客戶端執行結果
TCP服務端執行結果