socket実装pythonチャットルーム

2862 ワード

serverエンド
import socket
import json,struct
from concurrent.futures import ThreadPoolExecutor
debug = True

s = socket.socket()
s.bind(("127.0.0.1",8848))
s.listen()
clients = {}

pool = ThreadPoolExecutor(100)

def send_msg(soc, msg):
    l = len(msg.encode("utf-8"))
    soc.send(struct.pack("q",l))

    #    
    soc.send(msg.encode("utf-8"))

'''                   '''
def task(ip,c):
    while True:
        l = c.recv(8)
        ls = struct.unpack("q",l)[0]
        data = json.loads(c.recv(ls).decode("utf-8"))   #           。 eg:    data = {'to_addr':'msg':''}
        print('  %s   :%s'%(ip,data['msg']))
        #          
        #                               
        if data.get('to_addr'): #     json     ,    to_addr     ,        
            target_ip = data["to_addr"]        # data        ip
            target_conn = clients.get(target_ip)   #       conn  
            send_msg(target_conn,data['msg'])    #    
        else:
            for ip,conn in clients.items():
                # if c != target_conn:
                send_msg(conn,data['msg'])#data['msg']


        #     #                    
        #     to_addr = data["to_addr"]
        #     # print(data["to_addr"],"_______________")
        #     soc = clients.get(to_addr)
        #     send_msg(soc,data["msg"])
        # else:
        #     #               
        #     for k,soc in clients.items():
        #         # if soc != c:
        #             send_msg(soc,data["msg"])

while True:
    '''                '''
    c,add = s.accept()
    print("%s" % add[0],"      !")
    clients[add[0]] = c  #  ip    key,conn  value  clients    ,clients = {'192.188.3.4':conn  }
    if debug:
        print('clients=%s'%clients)

    '''                       '''
    pool.submit(task,add,c)


クライアント側
import socket,json,struct
from threading import Thread

c = socket.socket()
c.connect(("127.0.0.1",8848))
print("       !")
def recver():
    while True:
        lens_bytes = c.recv(8)
        lens = struct.unpack("q", lens_bytes)[0]
        recv_msg = c.recv(lens).decode("utf-8")
        print(recv_msg)

#           
Thread(target=recver).start()



while True:
    msg = input(">>>>:").strip() #   
    if "@" in msg:
        info = {"msg":msg.split("@")[0],"to_addr":msg.split("@")[1]}
    else:
        info = {"msg": msg}

    data = json.dumps(info).encode("utf-8")
    c.send(struct.pack("q",len(data)))
    c.send(data)