本文小编为大家详细介绍“怎么用python socket实现聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用python socket实现聊天室”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
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)
client端
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)
读到这里,这篇“怎么用python socket实现聊天室”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。