Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽(tīng)功能示例
本文實(shí)例講述了Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽(tīng)功能。分享給大家供大家參考,具體如下:
最近在研究boost C++庫(kù),用于工作中處理大規(guī)模高并發(fā)TCP連接數(shù)據(jù)響應(yīng),想測(cè)試,也可以用boost::asio庫(kù)來(lái)寫(xiě),但不利于測(cè)試代碼的靈活修改。
于是就研究了一下python怎么做。學(xué)習(xí)過(guò)程中看到網(wǎng)上給出的代碼示例雖然很基礎(chǔ)易懂,對(duì)于python零基礎(chǔ)的人來(lái)說(shuō),完全可以稍微復(fù)雜些,配上一些注釋,就能更多掌握一些socket和python的基本語(yǔ)法知識(shí)。
于是根據(jù)我的使用需要,修改python的socket server和client的范例代碼如下:
server端(單線程)
# -*- coding: cp936 -*- ''''' 建立一個(gè)python server,監(jiān)聽(tīng)指定端口, 如果該端口被遠(yuǎn)程連接訪問(wèn),則獲取遠(yuǎn)程連接,然后接收數(shù)據(jù), 并且做出相應(yīng)反饋。 ''' if __name__=="__main__": import socket print "Server is starting" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8001)) #配置soket,綁定IP地址和端口號(hào) sock.listen(5) #設(shè)置最大允許連接數(shù),各連接和server的通信遵循FIFO原則 print "Server is listenting port 8001, with max connection 5" while True: #循環(huán)輪詢socket狀態(tài),等待訪問(wèn) connection,address = sock.accept() try: connection.settimeout(50) #獲得一個(gè)連接,然后開(kāi)始循環(huán)處理這個(gè)連接發(fā)送的信息 ''''' 如果server要同時(shí)處理多個(gè)連接,則下面的語(yǔ)句塊應(yīng)該用多線程來(lái)處理, 否則server就始終在下面這個(gè)while語(yǔ)句塊里被第一個(gè)連接所占用, 無(wú)法去掃描其他新連接了,但多線程會(huì)影響代碼結(jié)構(gòu),所以記得在連接數(shù)大于1時(shí) 下面的語(yǔ)句要改為多線程即可。 ''' while True: buf = connection.recv(1024) print "Get value " +buf if buf == '1': print "send welcome" connection.send('welcome to server!') elif buf!='0': connection.send('please go out!') print "send refuse" else: print "close" break #退出連接監(jiān)聽(tīng)循環(huán) except socket.timeout: #如果建立連接后,該連接在設(shè)定的時(shí)間內(nèi)無(wú)數(shù)據(jù)發(fā)來(lái),則time out print 'time out' print "closing one connection" #當(dāng)一個(gè)連接監(jiān)聽(tīng)循環(huán)退出后,連接可以關(guān)掉 connection.close()
client端,每隔3秒輪番發(fā)送不同的數(shù)據(jù)給server:
if __name__=="__main__": import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 8001)) import time flag = '1' while True: time.sleep(3) print 'send to server with value: '+ flag sock.send(flag) print sock.recv(1024) flag = (flag=='1') and '2' or '1' #change to another type of value each time sock.close()
執(zhí)行上面兩段代碼后,可以得到如下結(jié)果:
先執(zhí)行server.py:
C:\Users\YanBo>D:\server.py Server is starting Server is listenting port 8001, with max connection 5
執(zhí)行client后:
C:\Users\YanBo>D:\client.py send to server with value: 1 welcome to server! send to server with value: 2 please go out! send to server with value: 1 welcome to server! send to server with value: 2 please go out! .....
server則相應(yīng)輸出:
Get value 1 send welcome Get value 2 send refuse .....
如果在linux下,用
$ lsof -i:8001
則可以列出正在執(zhí)行的server和client進(jìn)程,因?yàn)樗麄冋加昧硕丝?001
yanbo@yanbo-linux64-01:~$ lsof -i:8001 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python 2413 yanbo 3u IPv4 12907 0t0 TCP localhost:8001 (LISTEN) python 2413 yanbo 4u IPv4 12910 0t0 TCP localhost:8001->localhost:38609 (ESTABLISHED) python 2469 yanbo 3u IPv4 12222 0t0 TCP localhost:38609->localhost:8001 (ESTABLISHED)
可以看出,進(jìn)程2413是server.py 2469是client.py
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python 通過(guò)監(jiān)聽(tīng)端口實(shí)現(xiàn)唯一腳本運(yùn)行方式
- Python2.7:使用Pyhook模塊監(jiān)聽(tīng)鼠標(biāo)鍵盤(pán)事件-獲取坐標(biāo)實(shí)例
- python利用wx實(shí)現(xiàn)界面按鈕和按鈕監(jiān)聽(tīng)和字體改變的方法
- Python寫(xiě)一個(gè)基于MD5的文件監(jiān)聽(tīng)程序
- python 監(jiān)聽(tīng)salt job狀態(tài),并任務(wù)數(shù)據(jù)推送到redis中的方法
- python hook監(jiān)聽(tīng)事件詳解
- Python文件監(jiān)聽(tīng)工具pyinotify與watchdog實(shí)例
- Python實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽(tīng)多個(gè)客戶端請(qǐng)求
- Python利用pyHook實(shí)現(xiàn)監(jiān)聽(tīng)用戶鼠標(biāo)與鍵盤(pán)事件
- Python中使用PyHook監(jiān)聽(tīng)鼠標(biāo)和鍵盤(pán)事件實(shí)例
- Python監(jiān)聽(tīng)剪切板實(shí)現(xiàn)方法代碼實(shí)例
相關(guān)文章
Python字符串處理實(shí)現(xiàn)單詞反轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Python字符串處理實(shí)現(xiàn)單詞反轉(zhuǎn)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06有關(guān)Tensorflow梯度下降常用的優(yōu)化方法分享
今天小編就為大家分享一篇有關(guān)Tensorflow梯度下降常用的優(yōu)化方法分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python 批量操作設(shè)備的實(shí)現(xiàn)步驟
本文將結(jié)合實(shí)例代碼,介紹Python 批量操作設(shè)備的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例
今天小編就為大家分享一篇PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python 中如何使用 setLevel() 設(shè)置日志級(jí)別
這篇文章主要介紹了在 Python 中使用setLevel() 設(shè)置日志級(jí)別,Python 提供了一個(gè)單獨(dú)的日志記錄模塊作為其標(biāo)準(zhǔn)庫(kù)的一部分,以簡(jiǎn)化日志記錄,本文將討論日志記錄 setLevel 及其在 Python 中的工作方式,需要的朋友可以參考下2023-07-07Python+OpenCV 圖像邊緣檢測(cè)四種實(shí)現(xiàn)方法
本文主要介紹了通過(guò)OpenCV中Sobel算子、Schaar算子、Laplacian算子以及Canny分別實(shí)現(xiàn)圖像邊緣檢測(cè)并總結(jié)了四者的優(yōu)缺點(diǎn),感興趣的同學(xué)可以參考一下2021-11-11