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学习小技巧之利用字典的默认行为
May 20 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
python使用matplotlib绘制热图
Nov 07 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python生成特定分布数的实例
Dec 05 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 Python
python pygame 开发五子棋双人对弈
May 02 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
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
php 强制下载文件实现代码
2013/10/28 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
JS判定是否原生方法
2013/07/22 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
python实现数组插入新元素的方法
2015/05/22 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
python代码区分大小写吗
2020/06/17 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
怎样写好自荐信和推荐信
2013/12/26 职场文书
白酒市场营销方案
2014/02/25 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
服务行业口号
2014/06/11 职场文书
立春观后感
2015/06/18 职场文书
婚礼答谢词范文
2015/09/29 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS