中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用python socket實現聊天室

發布時間:2022-03-29 16:29:28 來源:億速云 閱讀:191 作者:iii 欄目:移動開發

本文小編為大家詳細介紹“怎么用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實現聊天室”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白朗县| 林甸县| 石渠县| 佛冈县| 乌拉特后旗| 桐庐县| 陵水| 德安县| 河间市| 托里县| 扶绥县| 扎鲁特旗| 台安县| 江口县| 都昌县| 福贡县| 安新县| 平昌县| 兴海县| 邢台市| 临朐县| 紫云| 上虞市| 商河县| 唐河县| 花垣县| 灌阳县| 康马县| 衡阳市| 德昌县| 万安县| 诏安县| 扎赉特旗| 高碑店市| 安龙县| 鄄城县| 扶余县| 中西区| 巴中市| 寿阳县| 蓝山县|