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 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
python 写的一个爬虫程序源码
Feb 28 Python
python实现汉诺塔方法汇总
Jul 25 Python
matplotlib作图添加表格实例代码
Jan 23 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
浅谈python3中input输入的使用
Aug 02 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
Python使用BeautifulSoup4修改网页内容
May 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
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
javascript 动态创建表格
2015/01/08 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
python实现发送邮件功能
2017/07/22 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python 日期与时间转换的方法
2020/08/01 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
材料物理专业大学毕业生求职信
2013/10/15 职场文书
酒吧员工的岗位职责
2013/11/26 职场文书
教师节学生演讲稿
2014/09/03 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
高三英语教学反思
2016/03/03 职场文书