Python简单实现socket信息发送与监听功能示例


Posted in Python onJanuary 03, 2018

本文实例讲述了Python简单实现socket信息发送与监听功能。分享给大家供大家参考,具体如下:

最近在研究boost C++库,用于工作中处理大规模高并发TCP连接数据响应,想测试,也可以用boost::asio库来写,但不利于测试代码的灵活修改。

于是就研究了一下python怎么做。学习过程中看到网上给出的代码示例虽然很基础易懂,对于python零基础的人来说,完全可以稍微复杂些,配上一些注释,就能更多掌握一些socket和python的基本语法知识。

于是根据我的使用需要,修改python的socket server和client的范例代码如下:

server端(单线程)

# -*- coding: cp936 -*-
'''''
建立一个python server,监听指定端口,
如果该端口被远程连接访问,则获取远程连接,然后接收数据,
并且做出相应反馈。
'''
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) #设置最大允许连接数,各连接和server的通信遵循FIFO原则
    print "Server is listenting port 8001, with max connection 5"
    while True: #循环轮询socket状态,等待访问
        connection,address = sock.accept()
        try:
            connection.settimeout(50)
            #获得一个连接,然后开始循环处理这个连接发送的信息
            '''''
            如果server要同时处理多个连接,则下面的语句块应该用多线程来处理,
            否则server就始终在下面这个while语句块里被第一个连接所占用,
            无法去扫描其他新连接了,但多线程会影响代码结构,所以记得在连接数大于1时
            下面的语句要改为多线程即可。
            '''
            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 #退出连接监听循环
        except socket.timeout: #如果建立连接后,该连接在设定的时间内无数据发来,则time out
             print 'time out'
        print "closing one connection" #当一个连接监听循环退出后,连接可以关掉
        connection.close()

client端,每隔3秒轮番发送不同的数据给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()

执行上面两段代码后,可以得到如下结果:

先执行server.py:

C:\Users\YanBo>D:\server.py
Server is starting
Server is listenting port 8001, with max connection 5

执行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则相应输出:

Get value 1
send welcome
Get value 2
send refuse
.....

如果在linux下,用

$ lsof -i:8001

则可以列出正在执行的server和client进程,因为他们占用了端口8001

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)

可以看出,进程2413是server.py 2469是client.py

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中的字典详细介绍
Sep 18 Python
python中split方法用法分析
Apr 17 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
Python中super函数用法实例分析
Mar 18 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
Django ModelForm组件使用方法详解
Jul 23 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
python 如何执行控制台命令与操作剪切板
May 20 Python
python解析照片拍摄时间进行图片整理
Jul 23 Python
python实现Floyd算法
Jan 03 #Python
Python如何生成树形图案
Jan 03 #Python
Python爬取十篇新闻统计TF-IDF
Jan 03 #Python
Python制作词云的方法
Jan 03 #Python
Python读取Json字典写入Excel表格的方法
Jan 03 #Python
python基于ID3思想的决策树
Jan 03 #Python
python遍历文件夹下所有excel文件
Jan 03 #Python
You might like
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP经典面试题集锦
2015/03/19 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python实现视频下载功能
2017/03/14 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
python3 爬取图片的实例代码
2018/11/06 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
最新党员的自我评价分享
2013/11/04 职场文书
财务部经理岗位职责
2014/02/03 职场文书
综合实践活动方案
2014/02/14 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
单位委托书格式范本
2014/09/29 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
质量保证书怎么写
2015/02/27 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
Vue操作Storage本地化存储
2022/04/29 Vue.js