脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python聊天室(虽然很简洁,但是可以用)

python聊天室(虽然很简洁,但是可以用)

2021-12-22 10:55wangziwenhk Python

这篇文章主要为大家详细介绍了python实现多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

 

python聊天室

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

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

python聊天室(虽然很简洁,但是可以用)

来给你们看

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

 

服务端

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("
公告:一个未知的人离开了聊天室......".encode("utf-8"))#广播
        return None
    for i in socket_list:
        i.send(f"
公告:欢迎{nikename}进入了聊天室........
".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

 

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/wangziwenhk/article/details/119810028

延伸 · 阅读

精彩推荐