每日熱訊!Python網(wǎng)絡(luò)編程之TCP服務(wù)端程序開發(fā)

2023-01-06 11:19:46 來(lái)源:51CTO博客


(資料圖)

一、開發(fā) TCP 服務(wù)端程序開發(fā)步驟回顧

創(chuàng)建服務(wù)端端套接字對(duì)象綁定端口號(hào)設(shè)置監(jiān)聽等待接受客戶端的連接請(qǐng)求接收數(shù)據(jù)發(fā)送數(shù)據(jù)關(guān)閉套接字

二、socket 類的介紹

導(dǎo)入 socket 模塊import socket

創(chuàng)建服務(wù)端 socket 對(duì)象socket.socket(AddressFamily, Type)

參數(shù)說(shuō)明:

AddressFamily 表示IP地址類型, 分為TPv4和IPv6Type 表示傳輸協(xié)議類型

方法說(shuō)明:

bind((host, port)) 表示綁定端口號(hào), host 是 ip 地址,port 是端口號(hào),ip 地址一般不指定,表示本機(jī)的任何一個(gè)ip地址都可以。listen (backlog) 表示設(shè)置監(jiān)聽,backlog參數(shù)表示最大等待建立連接的個(gè)數(shù)。accept() 表示等待接受客戶端的連接請(qǐng)求send(data) 表示發(fā)送數(shù)據(jù),data 是二進(jìn)制數(shù)據(jù)recv(buffersize) 表示接收數(shù)據(jù), buffersize 是每次接收數(shù)據(jù)的長(zhǎng)度

三、TCP 服務(wù)端程序開發(fā)示例代碼

import socketif __name__ == "__main__":    # 創(chuàng)建tcp服務(wù)端套接字    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 設(shè)置端口號(hào)復(fù)用,讓程序退出端口號(hào)立即釋放    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)     # 給程序綁定端口號(hào)    tcp_server_socket.bind(("", 8989))    # 設(shè)置監(jiān)聽    # 128:最大等待建立連接的個(gè)數(shù), 提示: 目前是單任務(wù)的服務(wù)端,同一時(shí)刻只能服務(wù)與一個(gè)客戶端,后續(xù)使用多任務(wù)能夠讓服務(wù)端同時(shí)服務(wù)與多個(gè)客戶端,    # 不需要讓客戶端進(jìn)行等待建立連接    # listen后的這個(gè)套接字只負(fù)責(zé)接收客戶端連接請(qǐng)求,不能收發(fā)消息,收發(fā)消息使用返回的這個(gè)新套接字來(lái)完成    tcp_server_socket.listen(128)    # 等待客戶端建立連接的請(qǐng)求, 只有客戶端和服務(wù)端建立連接成功代碼才會(huì)解阻塞,代碼才能繼續(xù)往下執(zhí)行    # 1. 專門和客戶端通信的套接字: service_client_socket    # 2. 客戶端的ip地址和端口號(hào): ip_port    service_client_socket, ip_port = tcp_server_socket.accept()    # 代碼執(zhí)行到此說(shuō)明連接建立成功    print("客戶端的ip地址和端口號(hào):", ip_port)    # 接收客戶端發(fā)送的數(shù)據(jù), 這次接收數(shù)據(jù)的最大字節(jié)數(shù)是1024    recv_data = service_client_socket.recv(1024)    # 獲取數(shù)據(jù)的長(zhǎng)度    recv_data_length = len(recv_data)    print("接收數(shù)據(jù)的長(zhǎng)度為:", recv_data_length)    # 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行解碼    recv_content = recv_data.decode("gbk")    print("接收客戶端的數(shù)據(jù)為:", recv_content)    # 準(zhǔn)備發(fā)送的數(shù)據(jù)    send_data = "ok, 問(wèn)題正在處理中...".encode("gbk")    # 發(fā)送數(shù)據(jù)給客戶端    service_client_socket.send(send_data)    # 關(guān)閉服務(wù)與客戶端的套接字, 終止和客戶端通信的服務(wù)    service_client_socket.close()    # 關(guān)閉服務(wù)端的套接字, 終止和客戶端提供建立連接請(qǐng)求的服務(wù)    tcp_server_socket.close()    執(zhí)行結(jié)果:客戶端的ip地址和端口號(hào): ("172.16.47.209", 52472)接收數(shù)據(jù)的長(zhǎng)度為: 5接收客戶端的數(shù)據(jù)為: hello

說(shuō)明:

當(dāng)客戶端和服務(wù)端建立連接后,服務(wù)端程序退出后端口號(hào)不會(huì)立即釋放,需要等待大概1-2分鐘。

解決辦法有兩種:

更換服務(wù)端端口號(hào)設(shè)置端口號(hào)復(fù)用(推薦大家使用),也就是說(shuō)讓服務(wù)端程序退出后端口號(hào)立即釋放。

設(shè)置端口號(hào)復(fù)用的代碼如下:

# 參數(shù)1: 表示當(dāng)前套接字# 參數(shù)2: 設(shè)置端口號(hào)復(fù)用選項(xiàng)# 參數(shù)3: 設(shè)置端口號(hào)復(fù)用選項(xiàng)對(duì)應(yīng)的值tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

網(wǎng)絡(luò)調(diào)試助手充當(dāng)客戶端程序:

標(biāo)簽: 程序開發(fā) 發(fā)送數(shù)據(jù) 二進(jìn)制數(shù)

上一篇:SREWorks v1.4 版本發(fā)布 | 離線安裝 & 前端重構(gòu)
下一篇:【世界獨(dú)家】嵌入式:AD接口設(shè)計(jì)