在昨天的最後,我照著書上試寫了簡單的socket服務端與用戶端,但礙於書上使用的是Python2,而我下載的版本是3.11,所以有滿多指令是被刪掉的,所以我在網上找了Python 3的Socket服務端與用戶端撰寫文章,深入了解後發現雖然撰寫並不難,但還是有很多小細節需要注意的。所以今天這篇我要來詳細了解如何撰寫Socket服務端與用戶端。
import socket
HOST = '0.0.0.0'
PORT = 9999
#先創建一個TCP socket
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#把Socket綁定到IP遞址和端口
s1.bind((HOST, PORT))
#開始監聽連接
s1.listen(5)
print(f"Server listening on {HOST}:{PORT}")
while True:
#接受來自用戶端的連接
conn, addr = s1.accept()
print(f"Connected by {addr}")
while True:
#接收來自用戶端的數據
data = conn.recv(1024)
if not data:
break
print(f"Received: {data.decode('utf-8')}")
#將數據傳回用戶端
conn.send(data)
conn.close()
import socket
HOST = '127.0.0.1'
PORT = 9999
c1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c1.connect((HOST, PORT))
while True:
msg = input("Please input msg (or 'exit' to quit): ")
if msg.lower() == 'exit':
break #如果用戶輸入"exit",則退出循環。
#將消息發送到服務端
c1.send(msg.encode('utf-8'))
#接收來自服務端的回傳消息。
data = c1.recv(1024)
print(f"Server sent: {data.decode('utf-8')}")
c1.close()
昨天的程式碼是書上的範例,今天的範例之所以會變比較長是因為Python版本的差別,例如raw_input這個函數在Python 3中整合成input(),書上是用比較舊的方式撰寫,然而資訊更新的很快,所以我希望用比較符合Python 3的程式碼來撰寫。接下來的主題我會從書上找,但撰寫程式碼的部分我會斟酌參考其他較新的文章。
參考資料:
https://docs.python.org/zh-tw/3/howto/sockets.html
https://ftn8205.medium.com/python-%E8%AA%B2%E7%A8%8B%E7%AD%86%E8%A8%98-10-%E7%B6%B2%E8%B7%AF%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88-f18c2b2a0865