Python Socket模块实现服务端与客户端通信
Socket是TCP/IP提供的外部編程接口,是對TCP/IP的封裝和應用。
Socket被稱作“套接字”,用于描述IP地址和端口,是一個通信、鏈的句柄,可以實現不同虛擬機 或不同計算機之間的通信。網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,應用程序通過“套接字”向網絡發出請求或者應答網絡請求。
Socket模塊的主要目的是幫助在網絡上的兩個程序之間建立信息通道。在Python中提供了兩個基本的Socket模塊:服務端Socket和客戶端Socket。
當創建一個服務端Socket之后,這個Socket就會在本機的一個端口上等待連接,客戶端Socket會訪問這個端口,當兩者完成連接之后,就可以進行交互了。
使用Socket編寫一個簡單的服務端和客戶端
多線程服務端程序:
# -*- coding: UTF-8 -*- import socket # 導入 socket 模塊 import threading# 處理客戶端的請求操作 def handle_client_request(service_client_socket, ip_port):# 循環接收客戶端發送的數據while True:# 接收客戶端發送的數據recv_data = service_client_socket.recv(1024)# 容器類型判斷是否有數據可以直接使用if語句進行判斷,如果容器類型里面有數據表示條件成立,否則條件失敗# 容器類型: 列表、字典、元組、字符串、set、range、二進制數據if recv_data:message = recv_data.decode()print(message)print(ip_port)# 回復service_client_socket.send("已接收...".encode())else:print("客戶端下線了:", ip_port)print()break# 終止和客戶端進行通信service_client_socket.close()if __name__ == '__main__':# 創建tcp服務端套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置端口號復用,讓程序退出端口號立即釋放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 綁定端口號tcp_server_socket.bind(("", 9090))# 設置監聽, listen后的套接字是被動套接字,只負責接收客戶端的連接請求tcp_server_socket.listen(128)# 循環等待接收客戶端的連接請求while True:# 等待接收客戶端的連接請求service_client_socket, ip_port = tcp_server_socket.accept()print("客戶端連接成功:", ip_port)# 當客戶端和服務端建立連接成功以后,需要創建一個子線程,不同子線程負責接收不同客戶端的消息sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))# 設置守護主線程sub_thread.setDaemon(True)# 啟動子線程sub_thread.start()# tcp服務端套接字可以不需要關閉,因為服務端程序需要一直運行# tcp_server_socket.close()客戶端程序:
# -*- coding: UTF-8 -*- import socket # 導入 socket 模塊if __name__ == '__main__':sk = socket.socket() # 創建 socket 對象host = socket.gethostname() # 獲取本地主機名port = 9090 # 設置端口號sk.connect((host, port))message = "connect······"sk.sendall(message.encode())print(sk.recv(1024).decode())i = 0while True:try:message = input(">>>")sk.send(message.encode())print(sk.recv(1024).decode())except KeyboardInterrupt:breaksk.close()運行結果:
Socket實例化
格式:
sk = socket.socket(family,type[,protocal])family:地址族,常用地址族有AF_INET、AF_INET6、AF_LOCAL(或稱AF_UNIX、UNIX域Socket)、AF_ROUTE等。默認為AF_INET,通常使用默認即可。
type:Socket類型
SOCK_STREAM,TCP類型(默認)
SOCK_DGRAM,UDP類型
SOCK_RAM,原始類型,允許對底層協議如IP或ICMP進行直接訪問,基本用不到。
protocol:可選項,使用的協議,通常賦值“0”,由系統自動選擇。
Socket常用函數
由 服務端 Socket調用,將之前創建Socket與指定的IP地址和端口進行綁定。
用于在使用TCP的服務端開啟監聽模式。
用于在使用TCP的服務端接收連接,一般是阻塞態。接受TCP連接并返回(conn, adress),其中conn為新的套接字對象,可以用來接收和發送數據,address為連接客戶端的地址。
用于在使用TCP的客戶端去連接服務端時使用
用于在使用TCP時發送數據,可能未將指定的內容全部發送。
用于在使用TCP時發送數據,完整發送TCP數據。
用于使用TCP接收數據。
sendto()
用于使用UDP時發送數據
recvfrom()
UDP專用,接收數據,返回遠端的IP地址和端口
close()
關閉Socket
總結
以上是生活随笔為你收集整理的Python Socket模块实现服务端与客户端通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arduino 土壤温湿度传感器_嫌ar
- 下一篇: C语言常量类型及名称,菜鸟带你入门C语言