Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能示例
本文實(shí)例講述了Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能。分享給大家供大家參考,具體如下:
最近在研究boost C++庫(kù),用于工作中處理大規(guī)模高并發(fā)TCP連接數(shù)據(jù)響應(yīng),想測(cè)試,也可以用boost::asio庫(kù)來寫,但不利于測(cè)試代碼的靈活修改。
于是就研究了一下python怎么做。學(xué)習(xí)過程中看到網(wǎng)上給出的代碼示例雖然很基礎(chǔ)易懂,對(duì)于python零基礎(chǔ)的人來說,完全可以稍微復(fù)雜些,配上一些注釋,就能更多掌握一些socket和python的基本語(yǔ)法知識(shí)。
于是根據(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地址和端口號(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),等待訪問
connection,address = sock.accept()
try:
connection.settimeout(50)
#獲得一個(gè)連接,然后開始循環(huán)處理這個(gè)連接發(fā)送的信息
'''''
如果server要同時(shí)處理多個(gè)連接,則下面的語(yǔ)句塊應(yīng)該用多線程來處理,
否則server就始終在下面這個(gè)while語(yǔ)句塊里被第一個(gè)連接所占用,
無法去掃描其他新連接了,但多線程會(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)聽循環(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文件與目錄操作技巧匯總》
希望本文所述對(duì)大家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è)客戶端請(qǐng)求
- 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)文章
對(duì)Python 窗體(tkinter)文本編輯器(Text)詳解
今天小編就為大家分享一篇對(duì)Python 窗體(tkinter)文本編輯器(Text)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python實(shí)用小知識(shí)之對(duì)象間的比較
== 和 is 是 Python 中對(duì)象比較常用的兩種方式,簡(jiǎn)單來說,'==' 操作符比較對(duì)象之間的值是否相等,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)用小知識(shí)之對(duì)象間比較的相關(guān)資料,需要的朋友可以參考下2021-10-10
利用python對(duì)excel中一列的時(shí)間數(shù)據(jù)更改格式操作
這篇文章主要介紹了利用python對(duì)excel中一列的時(shí)間數(shù)據(jù)更改格式操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python通過命令開啟http.server服務(wù)器的方法
這篇文章主要給大家介紹了關(guān)于Python通過命令開啟http.server服務(wù)器的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
使用python實(shí)現(xiàn)下載我們想聽的歌曲,速度超快
這篇文章主要介紹了使用python實(shí)現(xiàn)下載我們想聽的歌曲,速度超快,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools&apo
這篇文章主要給大家介紹了關(guān)于PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools'?not?found的解決辦法,文中通過圖文及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
Python實(shí)現(xiàn)自動(dòng)整理文件的示例代碼
在我們?nèi)粘I钪校募偸请s亂無章的,這個(gè)時(shí)候就需要我們整理一下。但是文件太多的話整理起來是非常麻煩的,因此我們今天就來用Python實(shí)現(xiàn)文件的自動(dòng)整理2022-08-08
利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測(cè)圖片
今天小編就為大家分享一篇利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測(cè)圖片,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01

