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脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python 爬虫爬取指定博客的所有文章
Feb 17 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
Python并发:多线程与多进程的详解
Jan 24 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 Python
Django REST framework 限流功能的使用
Jun 24 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中header和session_start前不能有输出原因分析
2013/01/11 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
node.js基础知识汇总
2020/08/25 Javascript
详解Python中用于计算指数的exp()方法
2015/05/14 Python
python3操作mysql数据库的方法
2017/06/23 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
公司活动邀请函
2014/01/24 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
银行员工考核评语
2014/12/31 职场文书
内勤岗位职责范本
2015/04/13 职场文书
2015年小学二年级班主任工作总结
2015/05/21 职场文书
杨善洲观后感
2015/06/04 职场文书
单位病假条范文
2015/08/17 职场文书
基于Python实现对比Exce的工具
2022/04/07 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js