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 OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
python通过实例讲解反射机制
Oct 17 Python
Python3如何对urllib和urllib2进行重构
Nov 25 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
python绘制规则网络图形实例
Dec 09 Python
Django 批量插入数据的实现方法
Jan 12 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
pandas抽取行列数据的几种方法
Dec 13 Python
python 基于opencv操作摄像头
Dec 24 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
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
vue配置多代理服务接口地址操作
2020/09/08 Javascript
python 实现归并排序算法
2012/06/05 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Django开发的简易留言板案例详解
2018/12/04 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Python 如何批量更新已安装的库
2020/05/26 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
总经理办公室主任岗位职责
2013/11/12 职场文书
俄罗斯商务邀请函
2014/01/26 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
护士医德医风自我评价
2014/09/15 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
教师节感谢信
2015/01/22 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers