使用多线程的缺点很明显。服务器为每个客户端开启一个线程,每个线程都阻塞等待读取。客户端需要两个线程,一个读,一个读。用于写作。epoll的代码还在研究中。https://github.com/jwzh222/epoll可以参考这个。对了,windows下没有epoll,只有linux支持。importsocketimportthreadingsocket_list=[]s=socket.socket()s.bind(('127.0.0.1',8888))s.listen()defread_client(s):try:#接收客户端数据returns.recv(2048.decode('utf-8')except:#如果有异常,说明连接失败,则删除socketprint(str(addr)+'Left!')socket_list.remove(s)defsocket_target(s):try:whileTrue:content=read_client(s)ifcontentisNone:breakelse:print(content)#将一个客户端发送的数据广播给其他客户端forclientinsocket_list:client.send((str(addr)+'say:'+content).encode('utf-8'))except:print('Error!')whileTrue:conn,addr=s.accept()#每当客户端连接时,它会添加它到套接字列表socket_list.append(conn)print(str(addr)+'Joined!')#每当客户端连接时,启动一个线程为其提供服务threading.Thread(target=socket_target,args=(conn,)).start()importsocketimportthreadings=socket.socket()s.connect(('10.34.22.166',8888))defread_server(s):whileTrue:#子线程负责从服务器接收数据并打印content=s.recv(2048).decode('utf-8')print(content)threading.Thread(target=read_server,args=(s,)).start()whileTrue:line=input('')ifline=='exit':break#主线程负责发送输入的数据用户到套接字s。发送(行。编码('utf-8'))
