python實現(xiàn)socket簡單通信的示例代碼
首先先來簡單介紹下socket:
(具體更詳細(xì)介紹的可以在網(wǎng)上找找,都講得非常詳細(xì)),這里主要是我自己的一些理解。
socket是在應(yīng)用層與傳輸層之間的一個抽象層,它的本質(zhì)是編程接口,通過socket,才能實現(xiàn)TCP/IP協(xié)議。
它就是一個底層套件,用來處理最底層消息的接受和發(fā)送。
socket翻譯為套接字,可以把TCP/IP復(fù)雜的操作抽象為簡單的幾個接口來供應(yīng)用層調(diào)用來實現(xiàn)進(jìn)程在網(wǎng)絡(luò)中的通信。socket起源于Unix,而Unix的基本要素之一就是“一切都為文件”,即可以通過打開——讀寫——關(guān)閉的模式來操作,通過這一點我們就可以來實現(xiàn)socket的簡單編寫
這里再貼上關(guān)于socket工作原理的具體圖像:
大家若有看不懂的,也先別著急,看完下面的再來結(jié)合這張圖理解會有更深的理解
其實在本機上,我們可以通過PID來標(biāo)識唯一一個進(jìn)程,但如果網(wǎng)絡(luò)中的兩個進(jìn)程要進(jìn)行通訊的話,PID的沖突就很大了,這個時候IP協(xié)議的ip地址就可以來標(biāo)識主機,而TCP的協(xié)議與端口號可以標(biāo)識主機的一個進(jìn)程,所以就可以通過ip地址+協(xié)議+端口號來標(biāo)識網(wǎng)絡(luò)中的某個進(jìn)程
大概了解的差不多了,我就來說說python里的socket庫
先簡單介紹一些socket庫里的參數(shù):
首先是地址蔟:
socket.AF_INET 表示的是IPv4(這也是socket里默認(rèn)的)
socket.AF_INET6 表示的是IPv6
socket.AF_UNIX 這個主要用于單一的UNIX進(jìn)程間的通信
然后是TYpe:
socket.SOCK_STREAM //流式socketTCP協(xié)議(默認(rèn)的),用來保證數(shù)據(jù)順序以及可靠性
socket.SOCK_DGRAM //這是報式socket UDP協(xié)議,保證數(shù)據(jù)接受的順序,不可靠的連接
socket.SOCK_RAW //這是原始套接字,允許對底層協(xié)議(TCP/IP)直接訪問
這里的流式與數(shù)據(jù)報式其實就是面向的區(qū)別:
流式是面向連接的TCP服務(wù)應(yīng)用,而數(shù)據(jù)報式就是非面向連接的UDP服務(wù)應(yīng)用,也就是無連接的socket
接著是一些方法的使用:
1:sk=socket.socket() :括號里面包含兩個參數(shù),一個參數(shù)默認(rèn)是ip地址蔟的socket.AF_INET,也就是IPv4;還有一個默認(rèn)是傳輸TCP協(xié)議,也就是socket.SOCK_STREAM
2:sk.bind(()) :最里面的括號里包含兩個參數(shù),分別是客戶端的ip地址與端口號
3:sk.listen(n): 里面的n表示阻塞連接n個進(jìn)程,也就是最大等待數(shù)為n個,當(dāng)連接上某個進(jìn)程后,其他的都不會連接上,會處于等待狀態(tài),只有當(dāng)斷開與這個進(jìn)程的連接,其他的進(jìn)程才會依次連上
4a,b=sk.accept():返回的是一個元組,元組的第一個參數(shù)是連接的信息,第二個參數(shù)是客戶端的ip地址與端口號
5a.recv(1024): recv()表示接受信息,里面的1024表示最多接受的字節(jié)數(shù),如果有多余的字符就下次再進(jìn)行傳輸
大致的參數(shù)講解完了,現(xiàn)在來開始服務(wù)端的腳本編寫:
# -*-coding: utf-8 -*- #引入socket庫 import socket #這是進(jìn)行定義一個ip協(xié)議版本AF_INET(IPv4),定義一個傳輸TCP協(xié)議,SOCK_STREAM sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定義ip地址與端口號,ip地址就是服務(wù)端的ip地址,端口隨便定義,但要與客戶端腳本一致 ip_port=('127.0.0.1',8000) #綁定一個端口 sk.bind(ip_port) #監(jiān)聽一個端口,這里的數(shù)字3是一個常量,表示阻塞3個連接,也就是最大等待數(shù)為3 sk.listen(3) #接受客戶端的數(shù)據(jù),并返回兩個參數(shù),a為連接信息,b為客戶端的ip地址與端口號 a,b=sk.accept() print(a) while True: data=a.recv(1024)#客戶端發(fā)送的數(shù)據(jù)存儲在recv里,1024指最大接受數(shù)據(jù)的量 print(data.decode('utf-8')) message=input("you can say:") a.send(message.encode('utf-8')) if message==('bye'): break
接著來編寫客戶端的腳本:
# -*- coding:utf-8 -*- #導(dǎo)入socket庫 import socket #定義一個ip協(xié)議版本AF_INET,為IPv4;同時也定義一個傳輸協(xié)議(TCP)SOCK_STREAM client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定義IP地址與端口號 ip_port=('127.0.0.1',8000) #進(jìn)行連接服務(wù)器 client.connect(ip_port) while True: message=input('You can say:') client.send(message.encode('utf-8'))#將發(fā)送的數(shù)據(jù)進(jìn)行編碼 a=client.recv(1024)#接受服務(wù)端的信息,最大數(shù)據(jù)為1k print(a.decode('utf-8')) if a.decode('utf-8')=='bye': break
這是運行的結(jié)果
左邊窗口是服務(wù)端代碼,右邊窗口是客戶端代碼,當(dāng)在服務(wù)端輸入bye過后,整個對話將關(guān)閉
以上就是socket的簡單通訊了
最后再講講UDP的專用代碼(UDP與TCP的代碼大致相同
sendto():這個函數(shù)用于在使用UDP時 發(fā)送數(shù)據(jù)
recvform():UDP專用,用于接受數(shù)據(jù),返回數(shù)據(jù)遠(yuǎn)端的IP地址和端口
closc():關(guān)閉socket
大家若有興趣可以自己去試試UDP的腳本實現(xiàn),這里就不做具體示范啦
到此這篇關(guān)于python實現(xiàn)socket簡單通信的示例代碼的文章就介紹到這了,更多相關(guān)python socket通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將數(shù)據(jù)集制作成VOC數(shù)據(jù)集格式的實例
今天小編就為大家分享一篇將數(shù)據(jù)集制作成VOC數(shù)據(jù)集格式的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02詳解Python調(diào)用系統(tǒng)命令的六種方法
這篇文章主要介紹了詳解Python調(diào)用系統(tǒng)命令的六種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01腳本測試postman快速導(dǎo)出python接口測試過程示例
這篇文章主要介紹了關(guān)于腳本測試postman快速導(dǎo)出python接口測試示例的過程操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Python 使用PIL numpy 實現(xiàn)拼接圖片的示例
今天小編就為大家分享一篇Python 使用PIL numpy 實現(xiàn)拼接圖片的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05jupyter notebook出現(xiàn)In[*]的問題及解決
這篇文章主要介紹了jupyter notebook出現(xiàn)In[*]的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Python獲取數(shù)據(jù)庫數(shù)據(jù)并保存在excel表格中的方法
今天小編就為大家分享一篇Python獲取數(shù)據(jù)庫數(shù)據(jù)并保存在excel表格中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python多進(jìn)程及通信實現(xiàn)異步任務(wù)的方法
這篇文章主要介紹了python多進(jìn)程及通信實現(xiàn)異步任務(wù)需求,本人也是很少接觸多進(jìn)程的場景,對于python多進(jìn)程的使用也是比較陌生的。在接觸了一些多進(jìn)程的業(yè)務(wù)場景下,對python多進(jìn)程的使用進(jìn)行了學(xué)習(xí),覺得很有必要進(jìn)行一個梳理總結(jié),感興趣的朋友一起看看吧2022-05-05