python實(shí)現(xiàn)socket簡(jiǎn)單通信的示例代碼
首先先來(lái)簡(jiǎn)單介紹下socket:
(具體更詳細(xì)介紹的可以在網(wǎng)上找找,都講得非常詳細(xì)),這里主要是我自己的一些理解。
socket是在應(yīng)用層與傳輸層之間的一個(gè)抽象層,它的本質(zhì)是編程接口,通過(guò)socket,才能實(shí)現(xiàn)TCP/IP協(xié)議。它就是一個(gè)底層套件,用來(lái)處理最底層消息的接受和發(fā)送。socket翻譯為套接字,可以把TCP/IP復(fù)雜的操作抽象為簡(jiǎn)單的幾個(gè)接口來(lái)供應(yīng)用層調(diào)用來(lái)實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中的通信。socket起源于Unix,而Unix的基本要素之一就是“一切都為文件”,即可以通過(guò)打開(kāi)——讀寫(xiě)——關(guān)閉的模式來(lái)操作,通過(guò)這一點(diǎn)我們就可以來(lái)實(shí)現(xiàn)socket的簡(jiǎn)單編寫(xiě)
這里再貼上關(guān)于socket工作原理的具體圖像:
大家若有看不懂的,也先別著急,看完下面的再來(lái)結(jié)合這張圖理解會(huì)有更深的理解
其實(shí)在本機(jī)上,我們可以通過(guò)PID來(lái)標(biāo)識(shí)唯一一個(gè)進(jìn)程,但如果網(wǎng)絡(luò)中的兩個(gè)進(jìn)程要進(jìn)行通訊的話,PID的沖突就很大了,這個(gè)時(shí)候IP協(xié)議的ip地址就可以來(lái)標(biāo)識(shí)主機(jī),而TCP的協(xié)議與端口號(hào)可以標(biāo)識(shí)主機(jī)的一個(gè)進(jìn)程,所以就可以通過(guò)ip地址+協(xié)議+端口號(hào)來(lái)標(biāo)識(shí)網(wǎng)絡(luò)中的某個(gè)進(jìn)程
大概了解的差不多了,我就來(lái)說(shuō)說(shuō)python里的socket庫(kù)先簡(jiǎn)單介紹一些socket庫(kù)里的參數(shù):首先是地址蔟:
socket.AF_INET 表示的是IPv4(這也是socket里默認(rèn)的)socket.AF_INET6 表示的是IPv6socket.AF_UNIX 這個(gè)主要用于單一的UNIX進(jìn)程間的通信
然后是TYpe:
socket.SOCK_STREAM //流式socketTCP協(xié)議(默認(rèn)的),用來(lái)保證數(shù)據(jù)順序以及可靠性socket.SOCK_DGRAM //這是報(bào)式socket UDP協(xié)議,保證數(shù)據(jù)接受的順序,不可靠的連接socket.SOCK_RAW //這是原始套接字,允許對(duì)底層協(xié)議(TCP/IP)直接訪問(wèn)
這里的流式與數(shù)據(jù)報(bào)式其實(shí)就是面向的區(qū)別:流式是面向連接的TCP服務(wù)應(yīng)用,而數(shù)據(jù)報(bào)式就是非面向連接的UDP服務(wù)應(yīng)用,也就是無(wú)連接的socket
接著是一些方法的使用:
1:sk=socket.socket() :括號(hào)里面包含兩個(gè)參數(shù),一個(gè)參數(shù)默認(rèn)是ip地址蔟的socket.AF_INET,也就是IPv4;還有一個(gè)默認(rèn)是傳輸TCP協(xié)議,也就是socket.SOCK_STREAM2:sk.bind(()) :最里面的括號(hào)里包含兩個(gè)參數(shù),分別是客戶(hù)端的ip地址與端口號(hào)3:sk.listen(n): 里面的n表示阻塞連接n個(gè)進(jìn)程,也就是最大等待數(shù)為n個(gè),當(dāng)連接上某個(gè)進(jìn)程后,其他的都不會(huì)連接上,會(huì)處于等待狀態(tài),只有當(dāng)斷開(kāi)與這個(gè)進(jìn)程的連接,其他的進(jìn)程才會(huì)依次連上4a,b=sk.accept():返回的是一個(gè)元組,元組的第一個(gè)參數(shù)是連接的信息,第二個(gè)參數(shù)是客戶(hù)端的ip地址與端口號(hào)5a.recv(1024): recv()表示接受信息,里面的1024表示最多接受的字節(jié)數(shù),如果有多余的字符就下次再進(jìn)行傳輸
大致的參數(shù)講解完了,現(xiàn)在來(lái)開(kāi)始服務(wù)端的腳本編寫(xiě):
# -*-coding: utf-8 -*-#引入socket庫(kù)import socket#這是進(jìn)行定義一個(gè)ip協(xié)議版本AF_INET(IPv4),定義一個(gè)傳輸TCP協(xié)議,SOCK_STREAMsk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#定義ip地址與端口號(hào),ip地址就是服務(wù)端的ip地址,端口隨便定義,但要與客戶(hù)端腳本一致ip_port=(’127.0.0.1’,8000)#綁定一個(gè)端口sk.bind(ip_port)#監(jiān)聽(tīng)一個(gè)端口,這里的數(shù)字3是一個(gè)常量,表示阻塞3個(gè)連接,也就是最大等待數(shù)為3sk.listen(3)#接受客戶(hù)端的數(shù)據(jù),并返回兩個(gè)參數(shù),a為連接信息,b為客戶(hù)端的ip地址與端口號(hào)a,b=sk.accept()print(a)while True: data=a.recv(1024)#客戶(hù)端發(fā)送的數(shù)據(jù)存儲(chǔ)在recv里,1024指最大接受數(shù)據(jù)的量 print(data.decode(’utf-8’)) message=input('you can say:') a.send(message.encode(’utf-8’)) if message==(’bye’):break
接著來(lái)編寫(xiě)客戶(hù)端的腳本:
# -*- coding:utf-8 -*-#導(dǎo)入socket庫(kù)import socket#定義一個(gè)ip協(xié)議版本AF_INET,為IPv4;同時(shí)也定義一個(gè)傳輸協(xié)議(TCP)SOCK_STREAMclient=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#定義IP地址與端口號(hào)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
這是運(yùn)行的結(jié)果
左邊窗口是服務(wù)端代碼,右邊窗口是客戶(hù)端代碼,當(dāng)在服務(wù)端輸入bye過(guò)后,整個(gè)對(duì)話將關(guān)閉
以上就是socket的簡(jiǎn)單通訊了
最后再講講UDP的專(zhuān)用代碼(UDP與TCP的代碼大致相同
sendto():這個(gè)函數(shù)用于在使用UDP時(shí) 發(fā)送數(shù)據(jù)recvform():UDP專(zhuān)用,用于接受數(shù)據(jù),返回?cái)?shù)據(jù)遠(yuǎn)端的IP地址和端口closc():關(guān)閉socket
大家若有興趣可以自己去試試UDP的腳本實(shí)現(xiàn),這里就不做具體示范啦
到此這篇關(guān)于python實(shí)現(xiàn)socket簡(jiǎn)單通信的示例代碼的文章就介紹到這了,更多相關(guān)python socket通信內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)2. 使用EF Code First搭建簡(jiǎn)易ASP.NET MVC網(wǎng)站并允許數(shù)據(jù)庫(kù)遷移3. XML解析錯(cuò)誤:未組織好 的解決辦法4. 淺談SpringMVC jsp前臺(tái)獲取參數(shù)的方式 EL表達(dá)式5. HTML5 Canvas繪制圖形從入門(mén)到精通6. XML入門(mén)的常見(jiàn)問(wèn)題(四)7. jsp+servlet簡(jiǎn)單實(shí)現(xiàn)上傳文件功能(保存目錄改進(jìn))8. JavaWeb Servlet中url-pattern的使用9. XML入門(mén)的常見(jiàn)問(wèn)題(一)10. asp批量添加修改刪除操作示例代碼
