python3利用socket和threading實現類似qq的多用戶羣聊

利用多線程threading實現簡單的羣聊服務器
服務端

import socket
import threading

users = {}
def msg_chat(cc, addr):
    userName = cc.recv(100000).decode('utf-8')
    users[userName] = cc
    print(userName + '已連接')
    for k, v in users.items():
        v.send((userName+'加入羣聊').encode('utf-8'))
    while True:
        try:
            msg = cc.recv(100000).decode('utf-8')
            for k, v in users.items():
                v.send((userName+'說:\n' + msg).encode('utf-8'))
        except Exception:
            print(userName+'斷開連接')
            del users[userName]
            for k, v in users.items():
                v.send((userName+'退出羣聊').encode('utf-8'))
            break

def startServer():
    ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ss.bind(('127.0.0.1', 9888))
    ss.listen(10)
    print('服務器已啓動...')
    while True:
        cc, addr = ss.accept()
        st = threading.Thread(target=msg_chat, args=(cc, addr))
        st.start()

def runServer():
    r = threading.Thread(target=startServer)
    r.start()

if __name__ == '__main__':
    runServer()

客戶端

import socket
import threading

ck = None
def recv_msg():
    while True:
        msg = ck.recv(100000).decode('utf-8')
        print(msg)
        if len(msg) == 0:
            ck.close()
            break

def connServer():
    global ck
    cc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    cc.connect(('127.0.0.1', 9888))
    userName = '張三'
    cc.send(userName.encode('utf-8'))
    ck = cc
    st = threading.Thread(target=recv_msg)
    st.start()

def send_msg():
    while True:
        msg = input('輸入消息:')
        ck.send(msg.encode('utf-8'))

if __name__ == '__main__':
    connServer()
    send_msg()

客戶端多複製幾份,修改用戶名字

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章