# -*- coding:utf-8 -*-
import socket
import select class testserver():
def __init__(self):
self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.serversocket.bind(('0.0.0.0', 8889))
self.serversocket.listen(128)
self.serversocket.setblocking(0) def run(self):
response = "connecting status: 200"
epoll = select.epoll()
epoll.register(self.serversocket.fileno(), select.EPOLLIN) try:
connections = {}
requests = {}
responses = {}
endflag = '\n\r\n' while True:
events = epoll.poll(1)
for fid, event in events:
if fid == self.serversocket.fileno():
connection, address = self.serversocket.accept()
connection.setblocking(0)
epoll.register(connection.fileno(), select.EPOLLIN)
connections[connection.fileno()] = connection
requests[connection.fileno()] = ''
responses[connection.fileno()] = response.encode() elif event & select.EPOLLIN:
try:
requests[fid] = connections[fid].recv(1024)
if len(str(requests[fid].decode())) == 0:
connections[fid].shutdown(socket.SHUT_RDWR)
break
else:
print("2 | ------ : " + str(requests[fid].decode()) + "\n")
byteswritten = connections[fid].send(responses[fid]) if endflag in requests[fid]:
epoll.modify(fid, select.EPOLLOUT)
connections[fid].setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, 1)
print('-' * 40 + '\n' + requests[fid].decode()[:-2])
except:
continue elif event & select.EPOLLOUT:
byteswritten = connections[fid].send(responses[fid])
responses[fid] = responses[fid][byteswritten:]
if len(responses[fid]) == 0:
connections[fid].setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, 0)
epoll.modify(fid, 0)
connections[fid].shutdown(socket.SHUT_RDWR) elif event & select.EPOLLHUP:
epoll.unregister(fid)
connections[fid].close()
del connections[fid] except:
print("server excepted ...")
epoll.unregister(self.serversocket.fileno())
self.run() finally:
print("server closed ...") if __name__ == "__main__":
serv = testserver()
serv.run()

python epoll方式tcp连接回发消息的更多相关文章

  1. 初识python:scoket 单用户互发消息

    实现功能: 启动"服务器".通过"客户端1"连接"服务器",然后互发消息.在此过程中,有"客户端2"连接到"服 ...

  2. 我们使用 Kafka 生产者在发消息的时候我们关注什么(Python 客户端 1.01 broker)

    之前使用 Kafka 的客户端消费者比较多一点,而且也是无脑订阅使用也没有深入了解过具体的参数.总的来说使用不够细节. 这次公司项目活动期间暴露非常多的问题,于是有了这篇文章. 首先我们来拆解一下 K ...

  3. C# Winform TCP发消息

    服务端: 代码: using System; using System.Collections.Generic; using System.IO; using System.Net; using Sy ...

  4. ActiveMQ发消息和收消息

    来自:http://blog.163.com/chengwei_1104/blog/static/53645274201382315625329/ ActiveMQ 是Apache出品,最流行的,能力 ...

  5. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  6. iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息

    等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...

  7. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  8. Python 网络通信协议 tcp udp区别

    网络通信的整个流程 在这一节就给大家讲解,有些同学对网络是既熟悉又陌生,熟悉是因为我们都知道,我们安装一个路由器,拉一个网线,或者用无限路由器,连上网线或者连上wifi就能够上网购物.看片片.吃鸡了, ...

  9. python之路----TCP与UDP

    TCP import socket #tcp协议 sk = socket.socket() # 买手机 创建一个socket对象 sk.bind(('127.0.0.1',8080)) # 给serv ...

随机推荐

  1. 教你如何在Drcom下使用路由器上校园网(以广东工业大学、极路由1S HC5661A为例)

    免责声明: 在根据本教程进行实际操作时,如因您操作失误导致出现的一切意外,包括但不限于路由器变砖.故障.数据丢失等情况,概不负责: 该技术仅供学习交流,请勿将此技术应用于任何商业行为,所产生的法律责任 ...

  2. 03-MySQL表操作

    MySQL表操作 1.介绍 表就相当于文件,表中的一条记录就相当与文件的一行内容,不同的是,表中的一条记录有对应的标题,成为表的字段. 2.创建表 2.1语法 create table 表名( 字段名 ...

  3. MVC和MVVM

    MVC和MVVM的qu'bie 1. Mvvm定义MVVM是Model-View-ViewModel的简写.即模型-视图-视图模型.[模型]指的是后端传递的数据.[视图]指的是所看到的页面.[视图模型 ...

  4. 工具(5): 极简开发文档编写(How-to)

    缘起 一个合格的可维护项目,必须要有足够的文档,因此一个项目开发到一定阶段后需要适当的编写文档.项目的类型多种多样,有许多项目属于内部项目,例如一个内部的开发引擎,或者一个本身就是面向开发者的项目. ...

  5. Apache No installed service named "Apache2.4"的解决办法

    windows安装Apache后,用cmd开启apache服务时,提示No installed service named "Apache2.4" 解决步骤: 1.cmd窗口,进入 ...

  6. slf4j+log4j2模式的日志搭建

    前言:今天打算为大家介绍一下我们我们在项目中必须得有的一个部分——日志!是的,就是那些让我们看着头疼的东西~~~好的日志可以帮助团队成员快速发现并解决问题,用好了可以大幅度提高代码缺陷修复效率!言归正 ...

  7. call, apply 和 bind 方法

    我们知道,每个函数在调用的时候会产生一个执行上下文环境,而这个执行上下文环境中包含了诸如 this 等等信息.即当我们调用函数的时候,内部的 this 已经明确地隐式绑定到了某一个对象上.如果我们希望 ...

  8. METO CODE 223 拉力赛

    传送门 继续水板子题... #include <bits/stdc++.h> #define ll long long using namespace std; inline int re ...

  9. 常见的cmd命令

    1.查看所有端口的使用情况:netstat -ano

  10. ajax基本原理与案例

    一.什么是Ajax AJAX即“Asynchronous Javascript And XML”( 异步 JavaScript和XML),AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互 ...