與使用者端程式碼不同(使用者端程式碼請看我的上一篇部落格),伺服器端需要繫結埠號,設定監聽服務,多了兩個特殊的步驟,需要兩行新的程式碼實現
準備:windows作為使用者端,windows上安裝網路偵錯助手,linux作為伺服器端並且寫好如下程式碼,並且查出自己伺服器端(linux虛擬機器器)上的ip地址為:
import socket
if __name__ == '__main__':
# 先建立伺服器端的通訊端物件,第一個引數同樣是ipv4協定,第二個引數是TCP協定
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 給程式繫結埠號(相對於使用者端程式碼多的步驟)
tcp_server_socket.bind(("", 9090))
# 設定監聽服務,等待使用者端向伺服器端傳送資訊
# 100:最大等待建立連線的個數
tcp_server_socket.listen(100)
# 等待使用者端建立連線的請求, 只有使用者端和伺服器端建立連線成功程式碼才會解阻塞,程式碼才能繼續往下執行
# 1. 專門和使用者端通訊的通訊端: service_client_socket
# 2. 使用者端的ip地址和埠號: ip_port
result = tcp_server_socket.accept()
print(result)
# 關閉伺服器端的通訊端, 終止和使用者端提供建立連線請求的服務
tcp_server_socket.close()
此時執行起來該程式,程式會停止在accept方法這,等待使用者端傳送請求,此時開啟網路偵錯助手:
點選連線,再返回虛擬機器器可以看見如下程式碼:
複製如下:
(<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘192.168.52.128’, 9090), raddr=(‘192.168.52.1’, 50036)>, (‘192.168.52.1’, 50036))
此輸出為一個元組,第一個引數是一個新的通訊端物件,後面的是來自於哪個ip地址發出的請求,也就是使用者端,此時開啟cmd,輸入ipconfig,可以查得本機ip:
注意:此時的通訊端物件為新的通訊端物件,不再是之前的tcp_server_socket物件,bind(繫結)後的通訊端可以理解為被動的通訊端,隨時準備接受來自使用者端的訊息,可以理解為之前的通訊端物件產生一個新的物件去接管新的任務,如果還有使用者端發來新的訊息,那麼tcp_server_socket又會產生一個新的通訊端物件去接管新的任務。