测试代码
服务端:
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())