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中的作用域规则详解
Jan 30 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python标准库笔记struct模块的使用
Feb 22 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
NumPy排序的实现
Jan 21 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
python如何代码集体右移
Jul 20 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
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP错误处理函数
2016/04/03 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
python+Django实现防止SQL注入的办法
2019/10/31 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
python有几个版本
2020/06/17 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
厂长助理岗位职责
2013/12/27 职场文书
护理医院见习报告
2014/11/03 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
2014年生产部工作总结
2014/12/17 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
redis缓存存储Session原理机制
2021/11/20 Redis
Vue+Flask实现图片传输功能
2022/04/01 Vue.js
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL