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 相关文章推荐
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
详解Python自建logging模块
Jan 29 Python
Python实现使用request模块下载图片demo示例
May 24 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
Python调用Windows命令打印文件
Feb 07 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
python脚本和网页有何区别
Jul 02 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
Python安装Bs4的多种方法
Nov 28 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数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
JavaScript错误处理
2015/02/03 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
Python寻找路径和查找文件路径的示例
2019/07/10 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
如何开启linux的ssh服务
2013/06/03 面试题
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
七一党建活动方案
2014/01/28 职场文书
《学棋》教后反思
2014/04/14 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
软环境建设心得体会
2014/09/09 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
运动会3000米加油稿
2015/07/21 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
Python语言中的数据类型-序列
2022/02/24 Python