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列表去重的二种方法
Feb 14 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
详解python调度框架APScheduler使用
Mar 28 Python
基于Python的文件类型和字符串详解
Dec 21 Python
python调用java的jar包方法
Dec 15 Python
python多线程同步实例教程
Aug 11 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
python中seaborn包常用图形使用详解
Nov 25 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
python3使用diagrams绘制架构图的步骤
Apr 08 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
使用python去除图片白色像素的实例
2019/12/12 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
小学教师教育随笔
2015/08/14 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
一行Python命令实现批量加水印
2022/04/07 Python