Socket 2.0

服务端:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值