天天看点

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()
           

客户端多复制几份,修改用户名字

继续阅读