server:
import selectors import socket # sel = selectors.DefaultSelector() # # def accept(sock, mask): # conn, addr = sock.accept() # Should be ready # print('accepted', conn, 'from', addr) # conn.setblocking(False) # sel.register(conn, selectors.EVENT_READ, read) # # def read(conn, mask): # data = conn.recv(1024) # Should be ready # if data: # print('echoing', repr(data), 'to', conn) # conn.send(data) # Hope it won't block # else: # print('closing', conn) # sel.unregister(conn) # conn.close() # # # sock = socket.socket() # sock.bind(('localhost', 10000)) # sock.listen(100) # sock.setblocking(False) # sel.register(sock, selectors.EVENT_READ, accept) # while True: # events = sel.select() #m默认阻塞,有活动连接就返回活动连接列表 # for key, mask in events: # callback = key.data #accept # callback(key.fileobj, mask) # class Server(object): def __init__(self,sel,sock): self.sel = sel self.sock = sock def run(self,host,port): self.sock.bind((host,port)) self.sock.listen(1000) self.sock.setblocking(False) self.sel.register(sock, selectors.EVENT_READ, self.accept) while True: events = self.sel.select() # m默认阻塞,有活动连接就返回活动连接列表 for key, mask in events: callback = key.data # accept callback(key.fileobj, mask) def accept(self, sock,mask): conn, addr = sock.accept() # Should be ready print('accepted', conn, 'from', addr) conn.setblocking(False) sel.register(conn, selectors.EVENT_READ, self.read) def read(self,conn, mask): data = conn.recv(1024) # Should be ready if data: print('echoing', repr(data), 'to', conn) conn.send(data) # Hope it won't block else: print('closing', conn) sel.unregister(conn) conn.close() if __name__== '__main__': sel = selectors.DefaultSelector() sock = socket.socket() host,port = 'localhost',10000 server_obj = Server(sel,sock) server_obj.run(host,port)
client:
import socket HOST = 'localhost' PORT = 10000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) while True: msg = bytes(input(">>:").strip(), encoding="utf-8") if msg == 'q'.encode("utf-8"): exit("退出!") s.sendall(msg) data = s.recv(1024) print('Received',data.decode()) s.close()