目录

    python聊天室

    很多人都觉得微信,qq,icq(我不知道现在还能不能用了)都过于垃圾,想要自己做一个聊天室(或是聊天软件),所以我们可以自己做一个。

    想要做出聊天室(或是聊天软件),我们就需要搞清楚它们的原理,这里我们用一个图片

    来给你们看

    我们可以看到,服务端其实就只是起到了一个转发消息的原理,搞清楚原理,就开始做

    服务端

    import socket,threading #导入文件
    def shou(new_s,socket_list):#创建一个收的函数
        try:
            nikename = new_s.recv(1024).decode('utf-8').strip()#为当前客户端执行一次‘收'来获取
        except:
            new_s.close()#关闭当前客户端的套接字
            socket_list.remove(new_s)#去除套接字列表里的nes_s
            for i in socket_list:
                i.send('\n公告:一个未知的人离开了聊天室......'.encode('utf-8'))#广播
            return none
        for i in socket_list:
            i.send(f'\n公告:欢迎{nikename}进入了聊天室........\n'.encode('utf-8'))#广播
        while 1:
            try:
                recv_data = new_s.recv(1024).decode('utf-8')#如果接受到了客户端发来的信息
                print(recv_data)#仅作提醒用
                for i in socket_list:
                    i.send(f'{nikename}:{recv_data}'.encode('utf-8'))#广播
            except:
                new_s.close()#关闭当前客户端的套接字
                socket_list.remove(new_s)#去除套接字列表里的nes_s
                for i in socket_list:
                    i.send(f'公告:{nikename}离开了聊天室......'.encode('utf-8'))#广播
                break#跳出循环
    def fa(new_s):
        while 1:
            msg = input('')#发出
            new_s.send(msg.encode('utf-8'))
    #创建套接字
    s = socket.socket(socket.af_inet,socket.sock_stream)
    #绑定
    s.bind(("",5678))#端口
    #监听
    s.listen(5)
    print('服务端处于监听状态,等待客户端接入..........')
    socket_list = []
    while 1:
        #接入
        new_s,addr = s.accept()
        print('客户端已接入')
        socket_list.append(new_s)
        new_s.send('请输入昵称:'.encode('utf-8'))
        t1 = threading.thread(target=shou,args=(new_s,socket_list))
        t2 = threading.thread(target=fa,args=(new_s,))
        t1.start()
        t2.start()
    # new_s.close()
    # s.close()
    
    

    客户端

    怎么样,服务端是不是很简单?接下来我们做客户端

    import socket,threading
    import tkinter as tk
    #创建套接字
    a = 1
    s = socket.socket(socket.af_inet,socket.sock_stream)
    s.connect(("127.0.0.1",5678))#此处端口看服务端的端口,127.0.0.1要改成服务端主机的ipv4地址
    print('已链接服务端,通讯加密中')
    def shou(s,msg_texe):
        recv_data = s.recv(1024).decode('utf-8')
        msg_text.insert(tk.end, recv_data)
        while 1:
            recv_data = s.recv(1024).decode('utf-8')
            msg_text.insert(tk.end,recv_data)
    def fa():
        global a
        if a == 0:
            msg = input_text.get('0.0',tk.end)
            s.send(msg.encode('utf-8'))
            input_text.delete('0.0',tk.end)
        else:
            msg = input_text.get('0.0', tk.end)
            s.send(msg.encode('utf-8'))
            input_text.delete('0.0', tk.end)
            msg_text.delete('0.0', tk.end)
            a = 0
    
    app = tk.tk()
    app.title('聊天室')
    #显示消息框
    msg_frame = tk.frame(app,width=480,height=300)
    msg_frame.grid(row=0,column=0,padx=6,pady=6)
    msg_frame.grid_propagate(0)#固定frame的大小
    msg_text = tk.text(msg_frame,bg='white')
    msg_text.grid()
    # msg_text.insert('0.0','hhh')
    #输入
    input_frame = tk.frame(app,width=480,height=100)
    input_frame.grid(row=1,column=0)
    input_frame.grid_propagate(0)
    input_text = tk.text(input_frame,bg='white')
    input_text.grid()
    #发送按钮
    btn_frame = tk.frame(app,width=480,height=20)
    btn_frame.grid(row=2,column=0,sticky='e')
    button = tk.button(btn_frame,text='发送',command=fa)
    button.grid()
    #线程
    t1 = threading.thread(target=shou,args=(s,msg_text))
    t1.daemon = true
    t1.start()
    app.mainloop()
    #s.close()
    
    

    伸手党下载链接:https://pan.baidu.com/s/1kd6p_a2kgfxbovn5yftqrw

    提取码:2iwk

    总结

    本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!