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()