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转码问题的解决方法
Oct 07 Python
Python实现求数列和的方法示例
Jan 12 Python
python读取csv文件并把文件放入一个list中的实例讲解
Apr 27 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
python生成requirements.txt的两种方法
Sep 18 Python
python实现的分层随机抽样案例
Feb 25 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 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使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
angularjs实现简单的购物车功能
2017/09/21 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
初学Python函数的笔记整理
2015/04/07 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
业务员岗位职责范本
2013/12/15 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
怎么写好自荐书
2014/03/02 职场文书
个人借款担保书
2014/04/02 职场文书
父母对孩子的寄语
2014/04/09 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
2015年工会工作总结
2015/03/30 职场文书
企业党支部工作总结2015
2015/05/21 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
python使用shell脚本创建kafka连接器
2022/04/29 Python
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers