1. 程式人生 > 其它 >使用 socket_server 建立一個簡單的伺服器和客戶端

使用 socket_server 建立一個簡單的伺服器和客戶端

使用 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服務端執行結果