python 使用epoll异步处理多个客户端的连接

服务器端:

#-*- coding:utf8 -*-
import socket
import select
import os

address = "0.0.0.0"
port = 10001
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

def main():
     global address,port,sock
     epoll = select.epoll()
     #获取创建好的sock的文件描述符
     fd = sock.fileno()
     sock.bind((address,port))
     sock_dict = {}
     sock_dict[fd] = sock
     #对该sock进行注册
     epoll.register(fd,select.EPOLLIN)
     sock.listen(5)
     while True:
         events = epoll.poll(1)
         for fileno,event in events:
	     #获取到的文件描述符和sock的相同就说明是一个新的连接
             if fileno == fd:
                 (client,address) = sock.accept()
                 print address
                 client.setblocking(0)
		 #将新的连接进行注册,用来接收消息
                 epoll.register(client.fileno(),select.EPOLLIN)
                 sock_dict[client.fileno()] = client
            elif event & select.EPOLLIN:
                 print "fileno:",fileno
                 data = sock_dict[fileno].recv(128)
                 if data == '你好':
                     print "Data:",data.decode('UTF-8')
                     sock_dict[fileno].send("你好")
                elif len(data) == 0:
                     print "线路%d已下线"%fileno
                     epoll.unregister(fileno)
                else:
                     print "Data:",data
if __name__ == '__main__':
    main()

客户端:

#coding: UTF-8

import socket
import select

address = "127.0.0.1"
port = 10001
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

def main():
    global address,port,sock
    sock.connect((address,port))
    epoll = select.epoll()
    fd = sock.fileno()
    #这里的epoll注册只是用来异步接收服务端发过来的消息
    epoll.register(fd,select.EPOLLIN)
    while True:
        events = epoll.poll(1)
        for fileno,event in events:
            if fileno == fd:
                if event & select.EPOLLIN:
                    data = sock.recv(128)
                    print data
        data = raw_input(">")
        if data == 'q':
            break
        elif data == '':
            print "不能发送空消息"
            continue
        sock.send(data)
    sock.close()
main()
时间: 2024-11-08 20:37:57

python 使用epoll异步处理多个客户端的连接的相关文章

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

python 协程, 异步IO Select 和 selectors 模块 多并发演示

主要内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 selectors 模块 多并发演示 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开

python同步和异步IO

目录 基本概念 IO模式 阻塞 I/O(blocking IO) 非阻塞 I/O(nonblocking IO) I/O 多路复用( IO multiplexing) 异步 I/O(asynchronous IO) IO模式总结 blocking和non-blocking的区别 synchronous IO和asynchronous IO的区别 处理IO问题的方法 事件驱动模型 IO多路复用机制 select poll epoll 基本概念 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那

python中asynchat异步socket命令/响应处理

该模块基于asyncore简化了异步客户端和服务器,并使其更容易元素处理由任意的字符串结束,或者是可变长度的的协议.它提供了抽象类async_chat,提供collect_incoming_data()和found_terminator()方法.循环和asyncore的一样,有2种信道:asyncore.dispatcher和asynchat.async_chat,可以自由混合信道.通常asyncore.dispatcher服务器通道在接收到连接请求时产生新的asynchat.async_cha

python的epoll及EPOLLLT

今天没事练习python的epoll,一开始写了个客户端: #! /usr/python import socket,sys,select c=socket.socket(socket.AF_INET,socket.SOCK_STREAM) host = '127.0.0.1' port=57777 c.connect((host,port)) epoll_fd = select.epoll() epoll_fd.register(c.fileno(),select.EPOLLIN) epoll

python之模块ftplib(FTP协议的客户端)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ftplib import FTP ftp = FTP() #设置变量 timeout = 30 port = 21 ftp.connect('192.168.1.188',port,timeout) # 连接FTP服务器 ftp.login('UserName','888888') # 登录 p

异步Socket服务器与客户端

本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. Socket连接(Socket Connection) Socket服务(Socket Service) 连接主机(Connection Host) 加密与压缩(Encrypt与Compress) 请求入队(Enqueuing Requests) 确保发送和接收(Ensure send and recie

Python socket模块实现TCP服务端客户端

Python socket模块实现TCP服务端客户端 写了详细的注释,如果有哪一行不明白,可留言哦. 服务端脚本 # _*_ coding: utf-8 _*_ __author__ = 'xiaoke' __date__ = '2018/6/13 14:39' # 这个脚本创建一个TCP服务器,它接收来自客户端的消息,然后将消息加上时间戳前缀并返回客户端 import socket from time import ctime HOST = '' PORT = 21567 BUFSIZ = 4

记一次Oracle session数过多引起进程数超过processes限制最终导致客户端无法连接的问题

RAC突然告警,客户端尝试连接时会报:ORA-12520: TNS:listener could not find available handler for requested type of server 错误. 现整理解决过程,以便于后续遇到此问题时快速处理. 1. 登入服务器,使用sqlplus / as sysdba 发现可以进入数据库. 2. 查看alert日志,发现日志中有个错误信息:ORA-00020: maximum number of processes (2000) exc