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中使用__slots__方法的详细教程
Apr 28 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
Python正则表达式使用经典实例
Jun 21 Python
python flask实现分页效果
Jun 27 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
Pycharm更换python解释器的方法
Oct 29 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
Django框架模板的使用方法示例
May 25 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
python新手学习可变和不可变对象
Jun 11 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下使用SMTP发邮件的代码
2008/01/10 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php图像处理类实例
2015/07/28 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
零基础学Python(一)Python环境安装
2014/08/20 Python
python统计一个文本中重复行数的方法
2014/11/19 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
在Python中定义一个常量的方法
2018/11/10 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
写出二分查找算法的两种实现
2013/05/13 面试题
幼儿园秋游活动方案
2014/01/21 职场文书
环保公益广告语
2014/03/13 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
会计学习心得体会
2014/09/09 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
运动会加油稿20字
2014/11/15 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL