socket编程

测试代码
服务端:

class A:
    def __init__(self, ip='127.0.0.1', port=9999):
        self.addr = ip, port
        self.sock = socket.socket()
        self.event = threading.Event()
        self.lock = threading.Lock()
        self.clients = {}

    def start(self):
        self.sock.bind(self.addr)
        self.sock.listen()
        threading.Thread(target=self.accep, name='accept').start()

    def accep(self):
        while not self.event.is_set():
            try:
                newsock, clientinfo = self.sock.accept()
                newfile = newsock.makefile('rw')
                with self.lock:
                    self.clients[clientinfo] = newsock, newfile
                print('{} is come in!'.format(clientinfo))
                threading.Thread(target=self.acve, name='acve', args=(newfile, newsock, clientinfo)).start()
            except:
                return 1

    def acve(self, newfile, newsock, clientinfo):
        while not self.event.is_set():
            try:
                line = newfile.readline()
            except:
                return 1
            if line.strip() == '' or line.strip() == 'quit':
                self.clients.pop(clientinfo)
                newfile.close()
                newsock.close()
                print('{} is quit!'.format(clientinfo))
                break
            msg = '{:%H:%M:%S} ip:{} port:{}  message:{}'.format(datetime.datetime.now(), *clientinfo, line)
            print(msg)
            with self.lock:
                for _, i in self.clients.values():
                    i.write(msg)
                    i.flush()

    def stop(self):
        clients = []
        with self.lock:
            clients = list(self.clients.values())
            self.clients.clear()
        for x, y in clients:
            x.close()
            y.close()
        self.event.set()
        self.sock.close()
        print(self.clients.items())


a = A()
a.start()
while True:
    cmd = input('>>>').strip()
    if cmd == 'quit':
        a.stop()
        break
    print(threading.enumerate())

客户端:

class C:
    def __init__(self, ip='127.0.0.1', port=9999):
        self.addr = ip, port
        self.sock = socket.socket()

    def start(self):
        self.sock.connect(self.addr)
        self.newfile = self.sock.makefile('rw')
        self.newfile.write('i am ready\n')   #需要换行符
        self.newfile.flush()
        threading.Thread(target=self.recv, name='recv').start()

    def recv(self):
        while True:
            line = self.newfile.readline()
            msg = 'C: {}'.format(line)
            # logger.info(msg)
    # def send(self, ):


c = C()
c.start()

while True:
    cmd = input('>>>').strip()
    msg = '{}\n'.format(cmd)
    c.newfile.write(msg)
    c.newfile.flush()

客户端2:

class C:
    def __init__(self, rip='127.0.0.1', rport=9999):
        self.raddr = rip, rport
        self.sock = socket.socket()
        self.event = threading.Event()

    def start(self):
        self.sock.connect(self.raddr)
        self.send('hello server')

        threading.Thread(target=self.recv, name='recv').start()

    def recv(self):
        while not self.event.is_set():
            data = self.sock.recv(1024)
            logger.info(data)

    def send(self, msg: str):
        self.sock.send(msg.encode())

    def stop(self):
        self.event.set()
        self.sock.close()

cc = C()
cc.start()

while True:
    cmd = input('>>>').strip()
    cmd = '{}\n'.format(cmd)
    if cmd == 'quit':
        cc.stop()
        break
    cc.send(cmd)
    logger.info(threading.enumerate())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值