一共两个客户端,服务端为每个客户端开启两个线程(比较浪费)
服务端代码
from socket import *
from threading import Thread
from queue import Queue
from time import ctime
HOST = ""
PORT = 12345
ADDR = (HOST, PORT)
conns = []
queues = []
client_dict = {}
class Receive(Thread):
def __init__(self, conn, q):
super().__init__()
self.conn = conn
self.q = q
def run(self):
if len(conns) == 1:
self.conn.send(bytes("对方当前不在线,请留言:", encoding='utf8'))
while True:
try:
data = self.conn.recv(1024)
if data.decode() == "quit":
self.conn.close()
conns.remove(self.conn)
for i in client_dict[self.conn]:
queues.append(i)
self.q.put("对方已下线,请留言:".encode())
break
else:
self.q.put(data)
except ConnectionResetError:
self.conn.close()
conns.remove(self.conn)
self.q.put("对方已下线,请留言".encode())
for i in client_dict[self.conn]:
queues.append(i)
break
class Send(Thread):
def __init__(self, conn, q):
super().__init__()
self.conn = conn
self.q = q
def run(self):
while True:
try:
if self.conn in conns:
data = self.q.get()
self.conn.send(data)
else:
self.conn.close()
break
except error:
break
def main():
server = socket(AF_INET, SOCK_STREAM)
server.bind(ADDR)
server.listen(2)
while True:
client, address = server.accept()
print(f"[{ctime()}]connected from {address}")
if len(conns) == 1:
conns[0].send(f"[{ctime()}]对方已上线".encode())
conns.append(client)
if len(conns) == 1:
que1 = Queue(10)
que2 = Queue(10)
queues.append(que1)
queues.append(que2)
else:
que1 = queues.pop()
que2 = queues.pop()
client_dict[client] = [que2, que1]
Receive(client, que1).start()
Send(client, que2).start()
if __name__ == '__main__':
main()
客户端
from socket import *
from threading import Thread
ADDR = 'localhost'
port = 12345
client = socket()
client.connect((ADDR, port))
mes = client.recv(1024)
print(mes.decode())
def send_msg():
while True:
data = input(">")
if data:
client.send(bytes(f"{data}", encoding='utf8'))
def recv_msg():
while True:
data = client.recv(1024)
if data:
print(data.decode())
if __name__ == '__main__':
s = Thread(target=send_msg)
r = Thread(target=recv_msg)
s.start()
r.start()
s.join()
r.join()