Python脚本:TCP server服务端开发 三次握手

import socket,time
server=socket.socket()

ip='127.0.0.1'
port=8888

#
# server.bind((ip,port))    #绑定
# server.listen()
# print(server)
#
# newsock,clientinfo=server.accept()
#
# print('newsock',clientinfo)
# data=newsock.recv(1024)
# print(data)
# newsock.send('server ack  data={}'.format(data).encode())
# newsock.close()
#
# newsock2,clientinfo2=server.accept()
# print('newsock2',clientinfo2)
# data=newsock2.recv(1024)
# print(data)
# newsock2.send('server new2  data={}'.format(data).encode())
# newsock2.close()
#
# server.close()



import socket,time,datetime,logging,threading

FORMAT= "%(asctime)s %(threadName)s %(thread)d %(message)s "
logging.basicConfig(format=FORMAT,level=logging.INFO)

class chatserver:
       def __init__(self,ip='127.0.0.1',port=8080):
           self.sock=socket.socket()
           self.addr=ip,port
           self.event=threading.Event()
           self.clients= {}
           self.lock = threading.Lock()
       def start(self):
           self.sock.bind(self.addr)
           self.sock.listen()
           threading.Thread(target=self.accept, name="accpet").start()

       def accept(self):
           while not self.event.is_set():
               newsock,clientiinfo=self.sock.accept()
               with self.lock:
                    self.clients[clientiinfo]=newsock
               threading.Thread(target=self.revc,name='revc',args=(newsock,clientiinfo)).start()
       def revc(self,sock:socket.socket, clientiinfo):
           while not self.event.is_set():
               try:
                   data=sock.recv(1024)  #客户端输入
               except:
                   data=b''
               print(data)
               if data.strip()==b'byte' or data.strip()==b'':
                   with self.lock:
                        self.clients.pop(clientiinfo)
                   sock.close()
                   break
               msg="{:%Y/%m/%d  %H:%M:%S} [{}:{}] - {}".format(datetime.datetime.now(),
                                                             *clientiinfo,data.decode())
               with self.lock:
                    exps=[]
                    for k,v in self.clients.items():
                        try:
                            v.send(msg.encode())#服务端 返回师傅
                        except:
                            exps.append(k)
                        for k in exps:
                            self.clients.pop(k)



       def stop(self):
           self.event.set()
           keys=[ ]
           with self.lock:
               keys = list(self.clients.keys())
               self.clients.clear()
           for i in keys:
                i.close()
           self.sock.close()

n=chatserver()
n.start()
while True:
      cmd=input(">>").strip()
      if cmd=='quit':
          n.stop()
          break
      logging.info(threading.enumerate())

验证工具使用的是socket调测工具,适合千人同时访问的脚本代码(需要工具可以私信)




 

猜你喜欢

转载自blog.csdn.net/m0_52454621/article/details/118181220