python3利用Socket實(shí)現(xiàn)通信的方法示例
參考于: python cs架構(gòu)實(shí)現(xiàn)簡(jiǎn)單文件傳輸
原文中程序運(yùn)行有誤,在此做修改與解釋,如下: 功能說(shuō)明:
共2個(gè)py文件分別為server和client端,采用socket進(jìn)行通信。提供兩種功能:“dir“ 命令用于顯示服務(wù)器端可下載文件名;“get/put+文件名“ 命令用于與服務(wù)器端進(jìn)行下載或發(fā)送數(shù)據(jù)交換。
Socket解釋
服務(wù)器上socket編寫步驟:
1.調(diào)用socket函數(shù)創(chuàng)建socket對(duì)象,如:
socket_server = socket.socket(family,type)
family參數(shù)代表地址家族,可為AF_INET(Internet通信)或AF_UNIX(同一臺(tái)機(jī)器上進(jìn)程間通信)。
type參數(shù)代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數(shù)據(jù)報(bào)套接字)。
2.使用socket對(duì)象的bind方法,將socket綁定到指定地址,如:
socket_server.bind(address)
由AF_INET所創(chuàng)建的套接字,address必須是一組雙元素元組,格式為(host,port)。
3.使用socket對(duì)象的listen方法接受連接請(qǐng)求,如:
socket_server.listen(backlog)
backlog指定最多允許多少個(gè)客戶連接到服務(wù)器,至少為1,如果達(dá)到設(shè)定值,則拒絕接受新請(qǐng)求。
4.服務(wù)器套接字通過(guò)socket對(duì)象的accept方法等待客戶請(qǐng)求一個(gè)連接,如:
connection,address = socket_server.accept()
運(yùn)行accept方法后,socket進(jìn)入“waiting”狀態(tài),等待客戶請(qǐng)求連接。當(dāng)客戶請(qǐng)求連接時(shí),accept方法建立連接并返回服務(wù)器,返回一組含兩個(gè)元素的元組(connection,address)。 connection是新的socket對(duì)象,服務(wù)器必須通過(guò)這個(gè)新的對(duì)象與客戶端進(jìn)行通信 ;address是客戶端的Internet地址。
5.處理階段,服務(wù)器和客戶端通過(guò)“send”和“recv”方法通信:
服務(wù)器調(diào)用send,并采用 二進(jìn)制 形式向客戶發(fā)送信息。send方法返回已發(fā)送的字符個(gè)數(shù)。
服務(wù)器使用recv方法從客戶端接受信息,調(diào)用recv時(shí),服務(wù)器必須指定一個(gè)整數(shù)來(lái)表示可通過(guò)本次方法調(diào)用來(lái)接受的最大數(shù)據(jù)量。recv方法在接收數(shù)據(jù)時(shí)會(huì)進(jìn)入“blocked”狀態(tài),最后返回一個(gè)字符串,它表示收到的數(shù)據(jù)。如果發(fā)送數(shù)據(jù)量超過(guò)recv所允許,數(shù)據(jù)會(huì)被截?cái)?。多余的?shù)據(jù)將緩沖到接收端。以后調(diào)用recv時(shí),多余的數(shù)據(jù)會(huì)從緩沖區(qū)刪除。
6.傳輸結(jié)束,調(diào)用socket對(duì)象的close方法關(guān)閉連接,如:
connection.close() socket_server.close()
注意:這里先關(guān)閉accept創(chuàng)建的新socket(connection)然后關(guān)閉服務(wù)器端socket(socket_server)
客戶端上socket編寫步驟:
1.創(chuàng)建一個(gè)socket以連接服務(wù)器,如:
socket_client = socket.socket(family,type)
2.使用connect方法連接服務(wù)器,對(duì)于AF_INET而言鏈接格式如:
socket_client.connect((host,port))
host代表主服務(wù)器主機(jī)名或IP,port為服務(wù)器進(jìn)程所綁定的端口號(hào)。
3.處理階段,客戶端和服務(wù)器端通過(guò)send與recv方法進(jìn)行通信 4.傳輸結(jié)束,調(diào)用close方法關(guān)閉連接,如:
socket_client.close()
注意這里的socket_client是第一步創(chuàng)建的對(duì)象,而服務(wù)器端使用的是accept創(chuàng)建的新socket(connection)
關(guān)于TCP的三次握手建立連接和四次揮手?jǐn)嚅_連接這里不做敘述(徹底講解我功夫不到家,不敢亂說(shuō)),把圖轉(zhuǎn)來(lái)大家看一下(這個(gè)感覺很基礎(chǔ), 但很重要):
三次握手
四次揮手
程序如下:
服務(wù)器端:
環(huán)境與服務(wù)器配置信息
接收文件方法
發(fā)送文件方法
處理命令1(接收、發(fā)送)方法
處理命令2(顯示可下載文件)方法
服務(wù)器端運(yùn)行主體
客戶端:
環(huán)境與服務(wù)器配置
接收文件方法
發(fā)送文件方法
確認(rèn)服務(wù)器端消息方法
處理命令1(接收、發(fā)送)方法
處理命令2(顯示可下載文件)方法
客戶端運(yùn)行主體
運(yùn)行說(shuō)明:
1.首先建立server.py和client.py文件,并分別置于兩個(gè)不同的位置,如圖:
Server文件夾及其py文件
Client文件夾及其py文件
在Server文件夾下放一個(gè)或多個(gè)文件用于下載(我這里是4個(gè)不同類型的文件以供下文dir指令調(diào)用)
在Client文件下放一個(gè)或多個(gè)文件用于上傳(我這里是一個(gè)word文本)
2.在Server目錄下運(yùn)行server.py,等待客戶端發(fā)送連接請(qǐng)求:
服務(wù)器端等待連接請(qǐng)求
3.在Client目錄下運(yùn)行client.py,向服務(wù)器端發(fā)送連接請(qǐng)求:
客戶端發(fā)送請(qǐng)求 & 服務(wù)器端連接成功
注意:先啟動(dòng)服務(wù)器,再啟動(dòng)客戶端,這個(gè)為什么不用多說(shuō)吧?
4.在客戶端輸入“dir”指令,查看可下載目錄文件:
“dir”指令
注:這里我用“\t“即制表符來(lái)控制顯示格式,但不知道為啥第一個(gè)文件后會(huì)自動(dòng)換行,暫且放著不去管它(不影響通信功能)
5.在客戶端輸入“get”指令,下載服務(wù)器中指定文件:
“get 射頻仿真.pptx“指令
“射頻仿真.pptx”下載成功
6.在客戶端輸入“put”指令,上傳指定文件到服務(wù)器:
“put 天線15.doc”指令
“天線15.doc”上傳成功
7.在客戶端輸入“close”指令,關(guān)閉連接,服務(wù)器進(jìn)入監(jiān)聽狀態(tài):
“close”指令
注意幾點(diǎn):
1.send方法的第一個(gè)參數(shù)是二進(jìn)制數(shù)據(jù),使用bytes(字符串,encoding='utf-8')將字符串改為二進(jìn)制進(jìn)行發(fā)送
2.在做指令判斷的時(shí)候,需要將“get”、“put”等指令轉(zhuǎn)為二進(jìn)制,才能與接收到的指令進(jìn)行判斷,這里不將二進(jìn)制轉(zhuǎn)為字符串(這樣易于理解)的原因是,我沒找到一個(gè)簡(jiǎn)單的方法讓二進(jìn)制轉(zhuǎn)str(我不會(huì))
3.理清楚創(chuàng)建流程后,主要的困難就是轉(zhuǎn)換數(shù)據(jù)格式,哪里需要轉(zhuǎn)哪里不需要,自己寫一遍,再debug一會(huì)兒就會(huì)弄明白了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python實(shí)現(xiàn)串口通信(pyserial)過(guò)程解析
- Python實(shí)現(xiàn)TCP通信的示例代碼
- Python使用pyserial進(jìn)行串口通信的實(shí)例
- Python3簡(jiǎn)單實(shí)現(xiàn)串口通信的方法
- Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例
- Python中的Socket 與 ScoketServer 通信及遇到問題解決方法
- Python網(wǎng)絡(luò)編程使用select實(shí)現(xiàn)socket全雙工異步通信功能示例
- 基于python實(shí)現(xiàn)藍(lán)牙通信代碼實(shí)例
相關(guān)文章
python生成器和yield關(guān)鍵字(完整代碼)
這篇文章主要介紹了python生成器和yield關(guān)鍵字,文章主要附上完整的代碼及些許的解釋說(shuō)明,需要的小伙伴可以參考一下2022-01-01python實(shí)現(xiàn)兩個(gè)經(jīng)緯度點(diǎn)之間的距離和方位角的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)兩個(gè)經(jīng)緯度點(diǎn)之間的距離和方位角的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python使用ctypes調(diào)用第三方庫(kù)時(shí)出現(xiàn)undefined?symbol錯(cuò)誤詳解
python中時(shí)間的庫(kù)有time和datetime,pandas也有提供相應(yīng)的時(shí)間處理函數(shù),下面這篇文章主要給大家介紹了關(guān)于python使用ctypes調(diào)用第三方庫(kù)時(shí)出現(xiàn)undefined?symbol錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2023-02-02Python中的yeild關(guān)鍵字提高代碼執(zhí)行效率場(chǎng)景實(shí)例探究
在Python編程語(yǔ)言中,yeild是一個(gè)非常實(shí)用的關(guān)鍵字,它不僅可以幫助你編寫更加簡(jiǎn)潔的代碼,還可以提高代碼的執(zhí)行效率,本文將詳細(xì)介紹yeild在Python中的使用方法,并通過(guò)示例代碼進(jìn)行演示,讓我們一起來(lái)探索這個(gè)強(qiáng)大的關(guān)鍵字吧2024-01-01Python?Excel操作從零學(xué)習(xí)掌握openpyxl用法
這篇文章主要為大家介紹了Python?Excel操作從零學(xué)習(xí)掌握openpyxl用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08詳解python調(diào)度框架APScheduler使用
本篇文章主要介紹了詳解python調(diào)度框架APScheduler使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Python使用回溯法子集樹模板獲取最長(zhǎng)公共子序列(LCS)的方法
這篇文章主要介紹了Python使用回溯法子集樹模板獲取最長(zhǎng)公共子序列(LCS)的方法,簡(jiǎn)單描述了最長(zhǎng)公共子序列問題并結(jié)合實(shí)例形式分析了Python基于回溯法子集樹模板獲取最長(zhǎng)公共子序列的操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09python實(shí)現(xiàn)的分層隨機(jī)抽樣案例
這篇文章主要介紹了python實(shí)現(xiàn)的分層隨機(jī)抽樣案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02PyTorch中torch.utils.data.DataLoader實(shí)例詳解
torch.utils.data.DataLoader主要是對(duì)數(shù)據(jù)進(jìn)行batch的劃分,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.utils.data.DataLoader的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09