TCP客户端与服务端
生活随笔
收集整理的這篇文章主要介紹了
TCP客户端与服务端
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
簡介
socket(簡稱:套接字)是進程之間通信的一個工具,好比現(xiàn)實中的插座,所有的家用電器要想工作都是基于插座進行,進程之間想要進行網(wǎng)絡(luò)通信需要基于這個socket,負責(zé)進程之間的網(wǎng)絡(luò)數(shù)據(jù)傳輸,好比數(shù)據(jù)的搬運工
一、TCP客戶端開發(fā)
import socket# 1.創(chuàng)建客戶端套接字對象 # 參數(shù)1:ipv4(ip協(xié)議的版本) # 參數(shù)2:選擇協(xié)議(SOCK_STREAM==>TCP協(xié)議) tcp_client_socket = socket.socket(socket.AF_INEF, socket.SCOK_STREAM)# 2.和服務(wù)端套接字建立連接 # 參數(shù):元組(有兩個元素!) # 參數(shù)1:服務(wù)器的ip地址(字符串) # 參數(shù)2:服務(wù)器的端口號(數(shù)字) tcp_client_socket.connect(("127.0.0.1", 8080))# 發(fā)送數(shù)據(jù)的時候需要先轉(zhuǎn)換成二進制 data = '123' # 編碼 data = data.encode("utf8")# 3.發(fā)送數(shù)據(jù) tcp_client_socket.send(data)# 4.接受數(shù)據(jù) # 參數(shù):以字節(jié)為單位的接受的數(shù)據(jù)的大小 recv_data = tcp_client_socket.recv(1024)# 5.關(guān)閉客戶端套接字 tcp_client_socket.close()二、服務(wù)端開發(fā)
import socket# 1.創(chuàng)建服務(wù)端的套接字對象 # 參數(shù)1:ipv4 # 參數(shù)2:tcp協(xié)議 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.綁定端口號 # 參數(shù):元組(兩個元素) 參數(shù)1:ip地址(字符串) 參數(shù)2:端口號(數(shù)字) # 參數(shù)1不寫就是默認本地IP地址(127.0.0.1) tcp_server_socket.bind(("參數(shù)1", 8080))# 3.設(shè)置監(jiān)聽 # 參數(shù):最大監(jiān)聽個數(shù)(排隊等待處理的最大個數(shù)) tcp_server_socket.listen(128)# 4.阻塞等待接受客戶端的連接請求 # 返回值是一個元組(有兩個元素) # 元素1:和客戶端進行通信的socket 元素2:客戶端的地址信息(ip,端口號) # 通過拆包語法 我們分別獲取兩個元素(client_socket負責(zé)處理客戶請求) client_socket, client_addr = tcp_server_socket.accept()# 5.接受數(shù)據(jù) # 參數(shù):接受數(shù)據(jù)的大小(字節(jié)) client_data = client_socket.recv(1024) # 對二進制的數(shù)據(jù)解碼 client_data = client_data.decode() print(client_data)# 6.發(fā)送數(shù)據(jù) send_data = "123".encode() client_socket.send(send_data)# 7.關(guān)閉套接字 client_socket.close() tcp_server_socket.close()三、端口復(fù)用
# 1.創(chuàng)建服務(wù)端套接字對象 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 在創(chuàng)建服務(wù)端后面設(shè)置端口復(fù)用 # 端口復(fù)用(一旦服務(wù)端關(guān)閉,端口馬上釋放) # setsocketopt: 設(shè)置socket選項 # 參數(shù)1:socket選項列表(SOL) # 參數(shù)2:地址復(fù)用 # 參數(shù)3:True:開啟選項(默認都是不開啟) tcp_server_socket.setsocketopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)四、持續(xù)接受數(shù)據(jù),判斷客戶端關(guān)閉
? ?(對中間的部分代碼進行改變)?
while True:# 5.服務(wù)端接受數(shù)據(jù)client_data = client_socket.recv(1024)# 如果接受的數(shù)據(jù)長度為零,則證明客戶端關(guān)閉if len(client_data) == 0:print("客戶端關(guān)閉!")break# 對二進制的數(shù)據(jù)解碼client_data = client_data.encode()print(client_data)# 6.發(fā)送數(shù)據(jù)send_data = "123".encode()client_data.send(send_data)五、服務(wù)端的多任務(wù)
import socket import multiprocessingdef handler_client_request(client_socket):""" 處理客戶端請求 """while True:# 接受數(shù)據(jù)client_data = client_socket.recv(1024)# 如果接受的數(shù)據(jù)長度為零,則證明客戶端關(guān)閉if len(client_data) == 0:print("客戶端關(guān)閉!")break# 對二進制的數(shù)據(jù)解碼client_data = client_data.encode()print(client_data)# 發(fā)送數(shù)據(jù)send_data = "123".encode()client_data.send(send_data)def main():# 1.創(chuàng)建服務(wù)端的套接字對象# 參數(shù)1:ipv4# 參數(shù)2:tcp協(xié)議tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.綁定端口號# 參數(shù):元組(兩個元素) 參數(shù)1:ip地址(字符串) 參數(shù)2:端口號(數(shù)字)# 參數(shù)1不寫就是默認本地IP地址(127.0.0.1)tcp_server_socket.bind(("參數(shù)1", 8080))# 3.設(shè)置監(jiān)聽# 參數(shù):最大監(jiān)聽個數(shù)(排隊等待處理的最大個數(shù))tcp_server_socket.listen(128)while True:# 4.阻塞等待接受客戶端的連接請求# 返回值是一個元組(有兩個元素)(元素1:和客戶端進行通信的socket 元素2:客戶端的地址信息(ip,端口號)# 通過拆包語法 我們分別獲取兩個元素(client_socket負責(zé)處理客戶請求)client_socket, client_addr = tcp_server_socket.accept()# 創(chuàng)建子進程sub_process = multiprocessing.Process(target=handler_client_request, args=(client_socket,))# 開啟子進程sub_process.start()# 關(guān)閉客戶端套接字client_socket.close()tcp_client_socket.close()if __name__ == '__main__':六、原理解析圖
總結(jié)
以上是生活随笔為你收集整理的TCP客户端与服务端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言函数返回数组
- 下一篇: hystrix 单独使用_使用Hystr