服务端:
from socketserver import ThreadingTCPServer
from socketserver import StreamRequestHandler
clients = {}
class ChatHandler(StreamRequestHandler):
def __init__(self, request, client_address, server):
super().__init__(request, client_address, server)
def setup(self):
super().setup()
clients[self.client_address] = self.request
self.event = threading.Event()
def handle(self):
self.event.clear()
while not self.event.is_set():
data = self.request.recv(1024)
if data.decode("utf-8") == "exit":
clients.pop(self.client_address)
self.request.close()
self.event.set()
for cli in clients.values():
cli.send((str(self.client_address).encode("utf-8") + b":" + data))
if __name__ == '__main__':
server = ThreadingTCPServer(("0.0.0.0", 9999), ChatHandler)
threading.Thread(target=server.serve_forever).start()
while True:
result = input("是否停止Web服务:")
if result == "Y":
server.shutdown()
break
客户端:
import socket
# 1.创建socket对象
cli = socket.socket()
# 2.创建连接 将客户端的套接字发送给服务端
cli.connect(("127.0.0.1", 9999))
event = threading.Event()
def _read(cli):
# 4.接收数据
while not event.is_set():
data = cli.recv(1024)
print("接收到消息:")
print(data.decode("utf-8"))
def _send(cli):
while not event.is_set():
# 3.发送一个消息
data = input(">>>")
cli.send(bytes(data, encoding="utf-8"))
if data == "exit":
event.set()
# 4.等待服务端的响应
t1 = threading.Thread(target=_send, args=(cli,))
t2 = threading.Thread(target=_read, args=(cli,))
t1.start()
t2.start()
t1.join()
t2.join()
cli.close()