Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶(hù)端通信
Python socket網(wǎng)絡(luò)編程
初學(xué) python,前段時(shí)間買(mǎi)了兩本書(shū)《python 編程從入門(mén)到實(shí)踐》《Python 核心編程第三版》,第一本書(shū)主要講的是一些基本語(yǔ)法和一些基本的使用方法,而第二本則深入很多,自己看來(lái)也是一知半解,剛好看到了這部分網(wǎng)絡(luò)編程,依然有好多不太理解的地方,不過(guò)想來(lái)通過(guò)自己不斷的摸索,不斷地搜尋資料學(xué)習(xí),早晚應(yīng)該會(huì)變得通透吧.......
這部分主要使用的模塊就是 socket 模塊,在這個(gè)模塊中可以找到 socket()函數(shù),該函數(shù)用于創(chuàng)建套接字對(duì)象,套接字也有自己的方法集,這些方法可以實(shí)現(xiàn)基于套接字的網(wǎng)絡(luò)通信。
socket()模塊函數(shù)
要?jiǎng)?chuàng)建套接字,必須使用 socket.socket()函數(shù),他一般的語(yǔ)法如下
socket(socket_family, socket_type, protocol=0)
其中socket_family是 AF_UNIX或 AF_INET,socket_type 是 SOCK_STREAM 或 SOCK_DGRAM,protocol 通常省略,默認(rèn)=0.
所以創(chuàng)建 TCP/IP 套接字,可以使用下面的方式調(diào)用 socket.socket().
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
同樣創(chuàng)建 UDP/IP 套接字,使用下面的方法調(diào)用
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
創(chuàng)建 TCP 服務(wù)器
創(chuàng)建 TCP 服務(wù)器的流程基本如下,并非正真正的代碼
ss = socket() #創(chuàng)建服務(wù)器套接字 ss.bind() #套接字與地址綁定 ss.listen() #監(jiān)聽(tīng)連接 inf_loop: #服務(wù)器無(wú)限循環(huán) cs = ss.accepr() #接受客戶(hù)端連接 comm_loop: #通信循環(huán) cs.recv()/cs.send() #對(duì)話(huà)(接收/發(fā)送) cs.close() #關(guān)閉客戶(hù)端套接字 ss.close() #關(guān)閉服務(wù)器套接字(可選)
實(shí)際中創(chuàng)建 TCP 服務(wù)器基本流程就如上邊所說(shuō),可能稍有不同但基本思路應(yīng)該是相通的,下邊是真正穿件服務(wù)器的代碼:
#!/usr/bin/env python # -*- coding: utf-8 -*- from socket import * #將 socket 屬性引入到命名空間 HOST = '' #這是對(duì) bind()方法的標(biāo)識(shí)表示可以使用任何可用的地址 PORT = 21571 #端口號(hào) BUFSIZ = 1024 #緩沖區(qū)大小,1kb ADDR = (HOST,PORT) #地址???? tcpSerSocket = socket(AF_INET,SOCK_STREAM) #創(chuàng)建 tcp 套接字 tcpSerSocket.bind(ADDR) #將地址綁定到套接字上 tcpSerSocket.listen(5) #設(shè)置并啟動(dòng)套接字監(jiān)聽(tīng) while True: #無(wú)限循環(huán),等待客戶(hù)端連接 print('waiting for connection...') tcpCliSocket,addr = tcpSerSocket.accept() #被動(dòng)接受客戶(hù)端連接 print('...connected from:',addr) while True: #對(duì)話(huà)循環(huán),等待客戶(hù)端發(fā)送消息 data = tcpCliSocket.recv(BUFSIZ) #接收客戶(hù)端消息 if not data: #如果消息是空白,跳出對(duì)話(huà)循環(huán),關(guān)閉當(dāng)前連接 break tcpCliSocket.send(data) #如果收到消息,將消息原封不動(dòng)返回客戶(hù)端 tcpCliSocket.close() tcpSerSocket.close()
創(chuàng)建 TCP 客戶(hù)端
同上邊一樣,一個(gè)簡(jiǎn)單的非代碼流程
cs = socket() #創(chuàng)建客戶(hù)端套接字 cs.connect() #嘗試連接服務(wù)器 comm_loop: #通信循環(huán) cs.send()/cs.recv() #對(duì)話(huà)(發(fā)送/接收) cs.close() #關(guān)閉客戶(hù)端套接字
實(shí)際中創(chuàng)建客戶(hù)端也是翻譯上邊的步驟
#!/usr/bin/env python # -*- coding: utf-8 -*- from socket import * HOST = 'localhost' #服務(wù)器的主機(jī)名 PORT = 21571 #端口號(hào) BUFSIZ = 1024 #緩沖區(qū) ADDR = (HOST,PORT) #地址 tcpCliSocket = socket(AF_INET,SOCK_STREAM) #創(chuàng)建客戶(hù)端套接字 tcpCliSocket.connect(ADDR) #連接服務(wù)器 while True: #通信循環(huán) data = input('> ') #客戶(hù)端輸入信息 if not data: #如果輸入信息為空,則跳出循環(huán),關(guān)閉通信 break data = str.encode(data) tcpCliSocket.send(data) #發(fā)送客戶(hù)端信息 data = tcpCliSocket.recv(BUFSIZ) #接受服務(wù)器返回信息 if not data: #如果服務(wù)器未返回信息,關(guān)閉通信循環(huán) break print('get:',data.decode('utf-8')) tcpCliSocket.close()
當(dāng)然,這只是最基礎(chǔ)的通信,而且關(guān)于主機(jī)名,端口號(hào)之類(lèi)的東西暫時(shí)還不是很懂,目前所做的只是在同一臺(tái)電腦上通信,端口號(hào)也需要一致,如果不同的電腦進(jìn)行通信該怎么做?我還只是個(gè)小白.....
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
python tkinter實(shí)現(xiàn)彩球碰撞屏保
這篇文章主要為大家詳細(xì)介紹了python tkinter實(shí)現(xiàn)彩球碰撞屏保,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07python 自定義異常和主動(dòng)拋出異常(raise)的操作
這篇文章主要介紹了python 自定義異常和主動(dòng)拋出異常(raise)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12基于python實(shí)現(xiàn)坦克大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了基于python實(shí)現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Python中json.dumps()和json.dump()的區(qū)別小結(jié)
在Python中,json.dumps()和json.dump()是兩個(gè)常用的函數(shù),本文主要介紹了Python中json.dumps()和json.dump()的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02python簡(jiǎn)單的函數(shù)定義和用法實(shí)例
這篇文章主要介紹了python簡(jiǎn)單的函數(shù)定義和用法,實(shí)例分析了Python自定義函數(shù)及其使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能,涉及Python基于difflib模塊的文件比較及smtplib模塊的郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下2019-02-02