python select poll epoll

select:

#!/usr/bin/python
# coding=utf-8

import socket
import select
import queue
import traceback
import sys

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.setblocking(False)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

addr = ("192.168.249.132", 5050)
server.bind(addr)

server.listen(5)

rlist = [server]
wlist = []
xlist = []

message_queue = {}

while True:
    inputs, outputs, errs = select.select(rlist, wlist, xlist)

    for sock in inputs:
        if sock == server:
            conn, address = server.accept()
            rlist.append(conn)

            message_queue[conn] = queue.Queue()
        else:
            try:
                data = sock.recv(1024)
                if data:
                    print('收到客户端[{0}]数据:{1}'.format(sock.getpeername(), data.decode()))
                    message_queue[sock].put(data)

                    if sock not in wlist:
                        wlist.append(sock)
            except socket.error as e:
                rlist.remove(sock)
                if sock in message_queue.keys():
                    del message_queue[sock]
                    # sock.close()

    for sock in outputs:
        try:
            if message_queue.get(sock) and not message_queue[sock].empty():
                data = message_queue[sock].get_nowait()
                sock.send(data)
            else:
                wlist.remove(sock)
        except:
            t, v, tb = sys.exc_info()
            print(t, v)
            traceback.print_exc()

            wlist.remove(sock)
            if sock in message_queue.keys():
                del message_queue[sock]

poll:

#!/usr/bin/python
# coding=utf-8

import select
import socket
import queue
import traceback
import sys

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.setblocking(False)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

ser_addr = ('192.168.249.132', 5050)
server.bind(ser_addr)

server.listen(5)

poll = select.poll()
poll.register(server.fileno(), select.POLLIN)

fdsets = {server.fileno(): server}
message_queue = {}

try:
    while True:
        for fd, event in poll.poll():
            if event & select.POLLIN:
                if fd == server.fileno():
                    conn, addr = server.accept()
                    conn.setblocking(False)
                    poll.register(conn.fileno(), select.POLLIN)
                    fdsets[conn.fileno()] = conn
                    message_queue[conn.fileno()] = queue.Queue()
                else:
                    sock = fdsets[fd]

                    try:
                        data = sock.recv(1024)
                        if data:
                            print("收到客户端[{0}]数据:{1}".format(sock.getpeername(), data.decode()))
                            message_queue[fd].put(data)
                            poll.modify(fd, select.POLLOUT)

                    except socket.error:
                        t, v, tb = sys.exc_info()
                        traceback.print_exc()
                        poll.unregister(fd)
                        # fdsets[fd].close()
                        if fd in message_queue:
                            del message_queue[fd]

            elif event & select.POLLOUT:
                try:
                    sock = fdsets[fd]
                    if fd in message_queue and not message_queue[fd].empty():
                        data = message_queue[fd].get_nowait()
                        sock.sendall(data)
                    else:
                        poll.modify(fd, select.POLLIN)
                except:
                    traceback.print_exc()
                    poll.unregister(fd)
                    # fdsets[fd].close()
                    if fd in message_queue:
                        del message_queue[fd]
finally:
    traceback.print_exc()

    poll.unregister(server.fileno())
    server.close()

epoll:

import socket
import select
import queue
import sys
import traceback
import logging

logger = logging.getLogger("aaa")
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter("")

filehandler = logging.FileHandler("aaa.log")
filehandler.setLevel(logging.ERROR)
filehandler.setFormatter(formatter)

logger.addHandler(filehandler)

streamhandler = logging.StreamHandler()
logger.addHandler(streamhandler)

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serveraddr = ("192.168.249.132", 5050)

serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.setblocking(False)

serversocket.bind(serveraddr)

serversocket.listen(10)

epoll = select.epoll()

epoll.register(serversocket.fileno(), select.EPOLLIN)

fd_to_socket = {}

fd_to_socket[serversocket.fileno()] = serversocket

while True:
    events = epoll.poll(10)

    if not events:
        continue

    for fd, event in events:
        register_socket = fd_to_socket[fd]

        if fd == serversocket.fileno():
            connection, addr = serversocket.accept()
            print("客户端[{0}]:加入".format(connection.getpeername()))
            connection.setblocking(False)
            epoll.register(connection.fileno(), select.EPOLLIN)
            fd_to_socket[connection.fileno()] = connection

        elif event & select.EPOLLIN:
            try:
                data = register_socket.recv(1024).decode()
                if data:
                    print("收到客户端[{0}]数据:{1}".format(register_socket.getpeername(), data))
                    epoll.modify(fd, select.EPOLLOUT)
            except:
                epoll.unregister(fd)
                # register_socket.close()
                del fd_to_socket[fd]

                t, v, tb = sys.exc_info()
                print(t, v)

                traceback.print_exc()
                traceback.print_tb(tb)

        elif event & select.EPOLLOUT:
            data = "abcde"
            register_socket.send(data.encode())
            epoll.modify(fd, select.EPOLLIN)

        elif event & select.EPOLLHUP:
            print("客户端退出")
            epoll.unregister(fd)
            register_socket.close()
            del fd_to_socket[fd]

client:

#!/usr/bin/python
# coding:utf-8

import socket


#创建socket对象
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#设置ip和端口
serveraddress = ("192.168.249.132", 5050)

#连接
clientsocket.connect(serveraddress)

try:
    while True:
        data = input("please input:")

        clientsocket.sendall(data.encode())

        server_data = clientsocket.recv(1024)

        print("收到服务端[{0}]数据:{1}".format(serveraddress, server_data.decode()))

finally:
    clientsocket.close()




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值