epoll在Windows下不能实现,只能在linux下实现
服务器端代码
import sys
import select
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ('', 3000)
s.bind(addr)
s.listen(120)
epoll = select.epoll()
epoll.register(s.fileno(), select.EPOLLIN)
epoll.register(sys.stdin.fileno(), select.EPOLLIN)
client_list = []
timeout = -1
while True:
events = epoll.poll(timeout)
for fd, event in events:
if fd == s.fileno():
new_client, new_addr = s.accept()
client_list.append(new_client)
epoll.register(new_client.fileno(), select.EPOLLIN)
else:
remove_client = None
for client in client_list:
if client.fileno() is fd:
data = client.recv(120)
if data:
for other_client in client_list:
if other_client.fileno() is not fd:
other_client.send(data)
else:
remove_client = client
pass
if remove_client:
client_list.remove(remove_client)
epoll.unregister(remove_client.fileno())
remove_client.close()
s.close()
客户端代码
import select
import socket
import sys
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dest_addr = ('192.168.40.128', 3000)
client.connect(dest_addr)
epoll = select.epoll()
epoll.register(client.fileno(), select.EPOLLIN)
epoll.register(sys.stdin.fileno(), select.EPOLLIN)
while True:
events = epoll.poll(-1)
for fd, event in events:
if fd == client.fileno():
data = client.recv(100)
if data:
print(data.decode('utf8'))
elif fd == sys.stdin.fileno():
data = input()
client.send(data.encode('utf8'))
client.close()
执行结果截图