在python中编写socket服务端模块(一):使用select
来源:互联网 发布:银行家算法代码 编辑:程序博客网 时间:2024/06/15 02:44
在linux上编写socket服务端程序一般可以用select、poll、epoll三种方式,本文主要介绍使用select编写socket服务端模块与客户端模块。
服务器端程序代码:
import socketimport selectimport Queueserver=('10.0.2.15',21345)#SOCK_STREAM(流套接字)、SOCK_DGRAM(数据报文套接字)、AF_INET(IPv4)sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#阻塞与端口复用前后顺序可换sock.setblocking(False)#SOL_SOCKET(套接字描述符)、SO_REUSEADDR(端口复用)sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)sock.bind(server)sock.listen(5)rlists=[sock]wlists=[]msg_que={}timeout=10while True: rs,ws,es=select.select(rlists,wlists,rlists,timeout) if not(rs or ws or es): print 'timeout...' continue #读部分 for s in rs: #看s是否是本机上用于监听的socket,是则接受连接,不是则接收数据 if s is sock: conn,addr=s.accept() #conn、addr分别是所接收到的socket对象和对方端口 print 'connect by',addr conn.setblocking(False) rlists.append(conn) #使用字典将conn与一个队列相对应 msg_que[conn]=Queue.Queue() else: data =s.recv(1024) if data: print data msg_que[s].put(data) if s not in wlists: wlists.append(s) else: if s in wlists: wlists.remove(s) rlists.remove(s) s.close del msg_que[s] #写部分 for s in ws: try: #get_nowait()跟get(0)一样 msg=msg_que[s].get_nowait() except Queue.Empty: print 'msg empty' wlists.remove(s) else: s.send(msg) #异常部分 for s in es: print 'except',s.getpeername() if s in rlists: rlists.remove(s) if s in wlists: wlists.remove(s) s.close del msg_que[s]
客服端程序代码:
# -*- coding: utf-8 -*- #使用utf-8在命令行窗口里才能运行import socketimport time#getpeername()获得socket对方的地址server=('10.0.2.15',21345)msg=['hello','welcome','xiaoming','zhangsan','list','liuliu']socks=[]for i in range(10): sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) socks.append(sock) for s in socks: s.connect(server)counter =0for m in msg: for s in socks: s.send('%d send %s' %(counter,m)) counter=counter+1 for s in socks: data =s.recv(1024) print '%s echo %s' %(s.getpeername(),data) if not data: s.close() time.sleep(2)
可以在编译器中运行服务端程序,然后使用命令行方式运行客户端程序进行测试。
- 在python中编写socket服务端模块(一):使用select
- 在python中编写socket服务端模块(一):使用select
- 在python中编写socket服务端模块(二):使用poll或epoll
- Python: 使用select函数编写nonblocking TCP/IP socket程序
- python socket 服务端使用ForkingMixIn
- python 网络编程(一):socket 模块
- 扩展Python__在python脚本中使用其他语言(c/c++/java/c#)编写的模块
- python——使用socket模块实现客户端与服务端通信
- Python:简单select模块使用
- python里使用select模块
- python select模块.select实现非阻塞socket,Popen等(特别在 Unix 下,它还可以用于管道)
- 在Python 中使用模块和类
- python基于socket模块的小型服务端、客户端
- 使用Socket 在服务端监听端口
- socket select模型(一)
- Python中的select模块如何使用?
- python模块之threading: 在python中使用多线程
- python模块之threading: 在python中使用多线程
- ABAP 搜索帮助的建立F4IF_INT_TABLE_VALUE_REQUEST
- C语言 位段的简单示例
- android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程
- Android-------C语言可执行程序编译实例
- 以图搜图相关资料
- 在python中编写socket服务端模块(一):使用select
- 开发笔记 那些年追过的图片(二): 读取相册里的图片 和 拍摄获取照片
- Android 检测目录是否存在,不存在则创建
- spring mvc上传文件Processing of multipart/form-data request failed
- linux内核源码阅读之facebook硬盘加速利器flashcache之初
- MapReduce调度与执行原理之任务调度
- 如何改变Visual Assist数据库文件路径(How do I change where VA stores its database?)
- Eclipse调试Java的10个技巧
- oracle小记之修改字符集解决中文乱码