基于selector的socket并发
server:
- #!_*_coding:utf-8_*_
- #__author__:"Alex huang"
- import selectors #selector模块集成了select,epoll,优先使用epoll,如果系统支持,windows不支持epoll
- import socket
- def accept(s,mask): #这个回调函数实现建立N个并发连接
- conn,addr = s.accept()
- print("established to ",addr)
- conn.setblocking(False)
- sel.register(conn,selectors.EVENT_READ,handle) #将连接加入selector并回调handle
- def handle(conn,mask): #要实现的功能写在这个回调函数内
- data = conn.recv(1024)
- if data:
- print("recv:",data.decode())
- re_data = data.decode().upper()
- conn.send(re_data.encode())
- else:
- print("closed conn...")
- sel.unregister(conn) #关闭连接
- conn.close()
- sel = selectors.DefaultSelector()
- s = socket.socket()
- s.bind(("0.0.0.0",5000))
- s.listen(5)
- sel.register(s,selectors.EVENT_READ,accept) #第一次回调accept,s是传给执行函数accept的参数
- while True:
- events = sel.select() #默认阻塞,有连接时就返回活动的连接列表
- for key,mask in events:
- callback = key.data
- callback(key.fileobj,mask)
client:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # author aliex-hrg
- __author__ = "alex"
- import socket
- import sys
- messages = [ 'This is the message. ',
- 'It will be sent ',
- 'in parts.',
- 'the end of'
- ]
- server_address = ('192.168.80.100', 5000)
- # Create a TCP/IP socket
- socks = [ socket.socket(socket.AF_INET, socket.SOCK_STREAM) for i in range(10000) ] #模拟10000个会话
- # Connect the socket to the port where the server is listening
- print('connecting to %s port %s' % server_address)
- for s in socks:
- s.connect(server_address)
- for message in messages:
- # Send messages on both sockets
- for s in socks:
- print('%s: sending "%s"' % (s.getsockname(), message) )
- s.send(message.encode())
- # Read responses on both sockets
- for s in socks:
- data = s.recv(1024)
- print( '%s: received "%s"' % (s.getsockname(), data) )
- if not data:
- print(sys.stderr, 'closing socket', s.getsockname() )
...
基于selector的socket并发的更多相关文章
- IO多路复用丶基于IO多路复用+socket实现并发请求丶协程
一丶IO多路复用 IO多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 IO多路复用作用: 检测多个socket是否已经发生变 ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- python全栈开发从入门到放弃之socket并发编程之协程
一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...
- C#高性能大容量SOCKET并发(十一):编写上传客户端
原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...
- C#高性能大容量SOCKET并发(七):协议字符集
原文:C#高性能大容量SOCKET并发(七):协议字符集 UTF-8 UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 362 ...
- Winfrom 基于TCP的Socket 编程
基于TCP的Socket基础例子 服务端的代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); ...
- 基于心跳的socket长连接
http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...
- 基于RTKLIB构建高并发通信测试工具
1. RTKLIB基础动态库生成 RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,由日本东京海洋大学的 ...
- 基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题
背景: 一个中小型H5游戏,后端使用基于 netty 的socket服务 服务端 分为 分发服务器 & 业务服务器,业务服务器可负载 用户客户端与分发服务器连接 分发服务器再作为客户端与每台业 ...
随机推荐
- awr脚本使用dump导出导入
实际工作中,存在这么一种场景.客户现场分析问题,无法立即得出结论,且无法远程服务器,因此对于服务器中的awr信息,如何提取是一个问题,oracle有脚本可以对服务器中以db为单位导出awr基表的dum ...
- Django之模型层-了解ORM
ORM(对象-关系-映射)简单使用 ORM实现了数据模型与数据库的解耦合,即数据模型的设计不需要指定特定的数据库,通过python代码可以直接对数据库实现增删改查 MySQL语法 #sql中的表 #创 ...
- 九度OJ1108-堆栈的使用
题目1108:堆栈的使用 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:11620 解决:3372 题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.P ...
- 九度OJ-1001-A+B矩阵-有些小技巧
题目1001:A+B for Matrices 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:22974 解决:9099 题目描述: This time, you are supposed ...
- Mariadb-10.1.22配置项
## These groups are read by MariaDB server.# Use it for options that only the server (but not client ...
- [LeetCode&Python] Problem 830. Positions of Large Groups
In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...
- CodeForces - 441E:Valera and Number (DP&数学期望&二进制)
Valera is a coder. Recently he wrote a funny program. The pseudo code for this program is given belo ...
- Gym - 101889D:Daunting device (老司机树)
题意:N个格子排出一排,开始格子颜色都是1:现在有M个操作: 或,把区间[L,R]颜色改为c: 或,查询一共有多少格子颜色为c. 最后求颜色最多的数量. 数据是随机的,且强制在线. 思路:ODT裸题. ...
- python3.x 正则表达式的应用
正则表达式是我认为比较难的一个东西,今天忽然又学到了这个,想到写下来,以后作为参考手册使用. python如果想使用python需要引用re方法,在文件开始进行引用. import re 接下来说一下 ...
- 求连续数字的和------------------------------用while的算法思想
前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...