Python簡單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能示例
本文實(shí)例講述了Python簡單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能。分享給大家供大家參考,具體如下:
最近在研究boost C++庫,用于工作中處理大規(guī)模高并發(fā)TCP連接數(shù)據(jù)響應(yīng),想測試,也可以用boost::asio庫來寫,但不利于測試代碼的靈活修改。
于是就研究了一下python怎么做。學(xué)習(xí)過程中看到網(wǎng)上給出的代碼示例雖然很基礎(chǔ)易懂,對于python零基礎(chǔ)的人來說,完全可以稍微復(fù)雜些,配上一些注釋,就能更多掌握一些socket和python的基本語法知識。
于是根據(jù)我的使用需要,修改python的socket server和client的范例代碼如下:
server端(單線程)
# -*- coding: cp936 -*- ''''' 建立一個(gè)python server,監(jiān)聽指定端口, 如果該端口被遠(yuǎ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地址和端口號 sock.listen(5) #設(shè)置最大允許連接數(shù),各連接和server的通信遵循FIFO原則 print "Server is listenting port 8001, with max connection 5" while True: #循環(huán)輪詢socket狀態(tài),等待訪問 connection,address = sock.accept() try: connection.settimeout(50) #獲得一個(gè)連接,然后開始循環(huán)處理這個(gè)連接發(fā)送的信息 ''''' 如果server要同時(shí)處理多個(gè)連接,則下面的語句塊應(yīng)該用多線程來處理, 否則server就始終在下面這個(gè)while語句塊里被第一個(gè)連接所占用, 無法去掃描其他新連接了,但多線程會影響代碼結(jié)構(gòu),所以記得在連接數(shù)大于1時(shí) 下面的語句要改為多線程即可。 ''' 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)聽循環(huán) except socket.timeout: #如果建立連接后,該連接在設(shè)定的時(shí)間內(nèi)無數(shù)據(jù)發(fā)來,則time out print 'time out' print "closing one connection" #當(dāng)一個(gè)連接監(jiān)聽循環(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入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
- Python 通過監(jiān)聽端口實(shí)現(xiàn)唯一腳本運(yùn)行方式
- Python2.7:使用Pyhook模塊監(jiān)聽鼠標(biāo)鍵盤事件-獲取坐標(biāo)實(shí)例
- python利用wx實(shí)現(xiàn)界面按鈕和按鈕監(jiān)聽和字體改變的方法
- Python寫一個(gè)基于MD5的文件監(jiān)聽程序
- python 監(jiān)聽salt job狀態(tài),并任務(wù)數(shù)據(jù)推送到redis中的方法
- python hook監(jiān)聽事件詳解
- Python文件監(jiān)聽工具pyinotify與watchdog實(shí)例
- Python實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽多個(gè)客戶端請求
- Python利用pyHook實(shí)現(xiàn)監(jiān)聽用戶鼠標(biāo)與鍵盤事件
- Python中使用PyHook監(jiān)聽鼠標(biāo)和鍵盤事件實(shí)例
- Python監(jiān)聽剪切板實(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à)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python 批量操作設(shè)備的實(shí)現(xiàn)步驟
本文將結(jié)合實(shí)例代碼,介紹Python 批量操作設(shè)備的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例
今天小編就為大家分享一篇PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python 中如何使用 setLevel() 設(shè)置日志級別
這篇文章主要介紹了在 Python 中使用setLevel() 設(shè)置日志級別,Python 提供了一個(gè)單獨(dú)的日志記錄模塊作為其標(biāo)準(zhǔn)庫的一部分,以簡化日志記錄,本文將討論日志記錄 setLevel 及其在 Python 中的工作方式,需要的朋友可以參考下2023-07-07Python+OpenCV 圖像邊緣檢測四種實(shí)現(xiàn)方法
本文主要介紹了通過OpenCV中Sobel算子、Schaar算子、Laplacian算子以及Canny分別實(shí)現(xiàn)圖像邊緣檢測并總結(jié)了四者的優(yōu)缺點(diǎn),感興趣的同學(xué)可以參考一下2021-11-11