在linux上编写socket服务端程序一般可以用select、poll、epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块。

使用poll方式的服务器端程序代码:

import socket
import select
import Queueserver_address=('10.0.2.15',21345)
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setblocking(False)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(server_address)
server.listen(5)message_queues={}
#poll时间单位是毫秒
timeout = 1000# Create a limit for the event
READ_ONLY = ( select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR)
READ_WRITE = (READ_ONLY|select.POLLOUT)# Set up the poller
poller = select.poll()
poller.register(server,READ_ONLY)
#Map file descriptors to socket objects
#server.fileno()是获得server这个socket的文件描述符,是int类型
fd_to_socket = {server.fileno():server,}while True:events = poller.poll(timeout)#fd是描述符,flag是event状态,都是int类型for fd ,flag in  events:# Retrieve the actual socket from its file descriptor#s为当前的socket对象s = fd_to_socket[fd]if flag & (select.POLLIN | select.POLLPRI) :if s is server :# A readable socket is ready to accept a connectionconnection , client_address = s.accept()print " Connection " , client_addressconnection.setblocking(False)fd_to_socket[connection.fileno()] = connectionpoller.register(connection,READ_ONLY)#Give the connection a queue to send datamessage_queues[connection]  = Queue.Queue()else :data = s.recv(1024)if data:# A readable client socket has dataprint "  received %s from %s " % (data, s.getpeername())message_queues[s].put(data)poller.modify(s,READ_WRITE)else :# Close the connectionprint "  closing" , s.getpeername()# Stop listening for input on the connectionpoller.unregister(s)s.close()del message_queues[s]elif flag & select.POLLHUP :#A client that "hang up" , to be closed.print " Closing ", s.getpeername() ,"(HUP)"poller.unregister(s)s.close()elif flag & select.POLLOUT :#Socket is ready to send data , if there is any to sendtry:next_msg = message_queues[s].get_nowait()except Queue.Empty:# No messages waiting so stop checkingprint s.getpeername() , " queue empty"poller.modify(s,READ_ONLY)else :print " sending %s to %s" % (next_msg , s.getpeername())s.send(next_msg)elif flag & select.POLLERR:#Any events with POLLERR cause the server to close the socketprint "  exception on" , s.getpeername()poller.unregister(s)s.close()del message_queues[s]

使用epoll方式的服务器端程序代码跟poll方式类似,具体代码如下:

import socket
import select
import Queueserver_address=('10.0.2.15',21345)
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setblocking(False)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(server_address)
server.listen(5)message_queues={}
#poll时间单位是毫秒
timeout = 1000# Create a limit for the event
READ_ONLY = ( select.EPOLLIN | select.EPOLLPRI | select.EPOLLHUP | select.EPOLLERR)
READ_WRITE = (READ_ONLY|select.EPOLLOUT)# Set up the poller
epoller = select.epoll()
epoller.register(server,READ_ONLY)
#Map file descriptors to socket objects
#server.fileno()是获得server这个socket的文件描述符,是int类型
fd_to_socket = {server.fileno():server,}while True:print "Waiting for the next event"events = epoller.poll(timeout)print events#fd是描述符,flag是event状态for fd ,flag in  events:# Retrieve the actual socket from its file descriptors = fd_to_socket[fd]if flag & (select.EPOLLIN | select.EPOLLPRI) :if s is server :# A readable socket is ready to accept a connectionconnection , client_address = s.accept()print " Connection " , client_addressconnection.setblocking(False)fd_to_socket[connection.fileno()] = connectionepoller.register(connection,READ_ONLY)#Give the connection a queue to send datamessage_queues[connection]  = Queue.Queue()else :data = s.recv(1024)if data:# A readable client socket has dataprint "  received %s from %s " % (data, s.getpeername())message_queues[s].put(data)epoller.modify(s,READ_WRITE)else :# Close the connectionprint "  closing" , s.getpeername()# Stop listening for input on the connectionepoller.unregister(s)s.close()del message_queues[s]elif flag & select.EPOLLHUP :#A client that "hang up" , to be closed.print " Closing ", s.getpeername() ,"(HUP)"epoller.unregister(s)s.close()elif flag & select.POLLOUT :#Socket is ready to send data , if there is any to sendtry:next_msg = message_queues[s].get_nowait()except Queue.Empty:# No messages waiting so stop checkingprint s.getpeername() , " queue empty"epoller.modify(s,READ_ONLY)else :print " sending %s to %s" % (next_msg , s.getpeername())s.send(next_msg)elif flag & select.EPOLLERR:#Any events with POLLERR cause the server to close the socketprint "  exception on" , s.getpeername()epoller.unregister(s)s.close()del message_queues[s]

客户端程序代码与上一篇博文中的相同。

在python中编写socket服务端模块(二):使用poll或epoll相关推荐

  1. python中使用socket编程实现带有界面的客户端向服务端发送文件和下载文件

    一主界面: **二:发送文件界面:**首先需要开启发送文件服务端(这里需要注意的是每一次发送文件之前都需要开启一次服务端,因为我在这里将每一次发送文件之后就关闭了客户端和服务端之间的连接) 输出相关客 ...

  2. 《零基础看得懂的C语言入门教程 》——(十三)socket服务端编写

    一.学习目标 了解C语言的socket的概念 了解C语言socket的使用方法 完成C语言socket服务端 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一篇:(一)脱离学习 ...

  3. Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态

    通过 getattr(socket, '_closed') 的返回值可以判断服务端的运行状态. True 是关闭状态,False 是运行中. 实例代码展示: import socketip = 'lo ...

  4. [置顶] C#中Socket服务端代码分享

    最近在对项目中Socket通讯中的服务端代码进行优化,保证能接受尽可能多的客户端的连接,并且不会丢掉连接,不会掉数据包.经过一段时间的反复测试和修改,终于达到了这一要求.服务端代码采用了异步通讯的方式 ...

  5. python搭建客户端和服务端

    python搭建客户端和服务端 前言 一.客户端搭建 搭建过程整理 TCP客户端 2.x版本 3.x版本 UPD客户端 2.x版本 3.x版本 二.TCP服务端搭建 搭建过程整理 2.x版本 3.x版 ...

  6. 【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

    HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket.现在把 HP-Socket 的所有代码向大众公开,希望能对大 ...

  7. idea 编写scala_在Scala中编写Angular服务

    idea 编写scala Those following my blog posts know that I like to take Scala everywhere. This time, let ...

  8. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  9. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  10. Java高级补充(Socket服务端、客户端)、Handler类、安卓Socket传数据、WebView

    Socket服务端简单地API: 主要用到以下几个API:ServerSocket用来设置端口号.accept用来和服务端连接.getInputStream用来获取输入流.read用来读取输入流里面的 ...

最新文章

  1. 你真的看懂招聘要求了?
  2. Swift 3.1 的一些新特性
  3. 机器学习深度学习论文写作工具推荐
  4. hbase-admin:一款简陋的hbase数据查询工具(支持2.2.6)
  5. 安徽工业大学计算机学院推免名单,2021年安徽工业大学拟录取推免研究生名单公示...
  6. 列表异步线程加载图片
  7. jboss fuse 教程_IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)
  8. vb6.0企业版win7_比win7更快?官方精简win10:3G+不更新,旧电脑福音
  9. T-SQL逻辑处理之表运算符
  10. HttpURLConnection类的使用
  11. formdata ie9怎么兼容_2021上半年教师资格证笔试报名如何设置兼容性?
  12. html_头部meta设置
  13. SpringCloud Nacos 【服务端】服务注册源码解析
  14. GRE蓝宝的核心词汇
  15. Surface设备完美安装Linux/Archlinux双系统教程
  16. 计算机自检后反复重启 主引导,电脑重装系统时,按错了意外重启然后就一直这样怎么办啊!...
  17. golang打包流程
  18. 烂土豆(JuicyPotato)提权
  19. [iOS、Unity、Android] 浅谈闭包的使用方法
  20. Axue8.0基础使用篇

热门文章

  1. Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCom
  2. Atititv2需求文档模板大纲目录 attilax总结
  3. paip.php-gtk 桌面程序 helloworld总结
  4. paip.提升安全性--CRSF跨站请求伪造的检测与防范
  5. 软件分层的利与不利之处.txt
  6. 日志记录总结要整理的地方
  7. 路孚特:金融行业数据复杂 成本高 难获取 看路孚特如何打破困局
  8. Rust : 闭包、move、复制与移动语义
  9. C#:重启后,AssemblyInfo中AssemblyTitle的描述内容显示正常.........
  10. 阿里巴巴CTO程立:CTO就是要给CEO扫清障碍和风险