千家信息网

如何利用Python打造一个多人聊天室

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要介绍如何利用Python打造一个多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、实验名称建立聊天工具二、实验目的掌握Socket编程中流套接字的技术,实
千家信息网最后更新 2025年11月12日如何利用Python打造一个多人聊天室

这篇文章主要介绍如何利用Python打造一个多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、实验名称

建立聊天工具

二、实验目的

掌握Socket编程中流套接字的技术,实现多台电脑之间的聊天。

三、实验内容和要求

vii.掌握利用Socket进行编程的技术

viii.必须掌握多线程技术,保证双方可以同时发送

ix.建立聊天工具

x.可以和多个人同时进行聊天

xi.必须使用图形界面,显示双方的语录

四、实验环境

PC多台,操作系统Win7,win10(32位、64位)

具备软件python3.6 。

五、操作方法与实验步骤

服务端

1.调入多线程、与scoket包,用于实现多线程连接

2.记录本地地址与端口,开启监听,等待请求

3.收到某个客户端的请求,建立连接,为每一个客户端分配一个线程,并记录客户端地址与端口

4.收到某个客户端发送的数据,将数据转发给所有与服务器连接的客户机。

5.当某个客户端断开连接,通知所有与服务器连接的客户机。

6.服务器一直保持监听状态,等待其他客户端接入服务器

7.代码

import socketimport threadingnum=0def chat(service_client_socket,addr):     # 等待接收客户端消息存放在2个变量service_client_socket和addr里    if not addr in user:          print('Accept new connection from %s:%s...' % addr)        # 如果addr不在user字典里则执行以下代码        for scs in serv_clie_socket:             serv_clie_socket[scs].send(data +' 进入聊天室...'.encode('utf-8'))              # 发送user字典的data和address到客户端        user[addr] = data.decode('utf-8')  #data 是最新进入聊天室的客户,解压后放入user        serv_clie_socket[addr] = service_client_socket #将服务器与服务器端口号为addr的套接字放入字典        # 接收的消息解码成utf-8并存在字典user里,键名定义为addr    #print("可以开始聊天了>>>>>>")           # 如果addr在user字典里,跳过本次循环    while True:        d = service_client_socket.recv(1024)        if (('EXIT'.lower() in d.decode('utf-8'))|(d.decode('utf-8') == 'error1')):            #如果EXIT在发送的data里            name = user[addr]               #user字典addr键对应的值赋值给变量name            user.pop(addr)             serv_clie_socket.pop(addr)                 #删除user里的addr            for scs in serv_clie_socket:                     #从user取出address                serv_clie_socket[scs].send((name + ' 离开了聊天室...').encode('utf-8'))                     #发送name和address到客户端            print('Connection from %s:%s closed.' % addr)            global num            num = num-1            break        else:             print('"%s" from %s:%s' %(d.decode('utf-8'), addr[0], addr[1]))              for scs in serv_clie_socket:                    #从user遍历出address                if serv_clie_socket[scs] != service_client_socket:                      #address不等于addr时,执行下面的代码                    serv_clie_socket[scs].send(d)                         #发送data到客户端s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建socket对象addr = ('127.0.0.1', 9999)s.bind(addr)  # 绑定地址和端口s.listen(128)print('TCP Server on', addr[0], ":",addr[1],"......")user = {}  # 存放字典{addr:name}serv_clie_socket = {} #存放{socket:不同线程的套接字}while True:    try:        print("等待接收客户端的连接请求....")        service_client_socket, addr = s.accept() # 等待接收客户端的连接请求        print("接收到客户端的连接请求....")    except ConnectionResetError:        print('Someone left unexcept.')    data = service_client_socket.recv(1024)    if data.decode()=='error1':        print(addr,"关闭了登录窗口。。。")        continue    print("data = ",data.decode())                 #为服务器分配线程    num=num+1    r = threading.Thread(target=chat, args=(service_client_socket,addr), daemon=True)     r.start()    print("聊天室人数:",num)

客户端

1.调入多线程、与scoket包,用于实现多线程连接,调入tkinter包,用于图形化页面展示

2.记录本地地址与端口,向服务器发送连接请求,建立持续连接

3.图形化登录界面,记录输入的用户名,发送给服务器

4.进入聊天界面,从服务器接收到的消息显示在左边,发送给服务器的消息显示在右边

5.退出时,弹出警示界面。退出后,与服务器断开连接,结束。

6.代码

7.其他:客户端代码中的server改成服务器地址,客户端可以在不同的电脑上运行连接服务器,通过服务器与其他的客户端通讯。

#客户端import tkinterfrom tkinter import fontimport tkinter.messageboximport socketimport threadingimport timestring=''def my_string(s_input):    string = s_input.get()def Send(sock):    '''        发送数据的方法        参数:            sock:定义一个实例化socket对象            server:传递的服务器IP和端口    '''    if string!='':        message = name + ' : ' + string        data = message.encode('utf-8')        sock.send(data)        if string.lower() == 'EXIT'.lower():            exit()def recv(sock):    sock.send(name.encode('utf-8'))    while True:        data = sock.recv(1024)        #加一个时间戳        time_tuple = time.localtime(time.time())        str = ("{}点{}分".format(time_tuple[3],time_tuple[4]))        rrecv = tkinter.Label(t,text=data.decode('utf-8'),width=40,anchor='w',bg='pink')#接收的消息靠左边        rrecv.pack()def left():    global string    string = rv1.get()    Send(s)    if string!='':        rleft = tkinter.Label(t,text=string,width=40,anchor='e')#发送的消息靠右边        rleft.pack()        rv1.set('')def Creat():    global name    name = n.get()        #接收进程    tr = threading.Thread(target=recv, args=(s,), daemon=True)    # daemon=True 表示创建的子线程守护主线程,主线程退出子线程直接销毁    tr.start()         l.destroy()    e.destroy()     b.destroy()    t.title("聊天室")    t.geometry("500x600")    rL0 = tkinter.Label(t,text='%s的聊天室'%name,width=40)    rL0.pack()    rL1 = tkinter.Label(t,text='请输入消息:',width=20, height=1)    rL1.place(x=0,y=450)    rE1 = tkinter.Entry(t, textvariable = rv1)    rE1.place(x=200,y=450)     rB1 = tkinter.Button(t, text="发送",command=left)      rB1.place(x=380,y=450)    #发送进程def JieShu():    tkinter.messagebox.showwarning(title='你确定退出吗?', message='刚才你点击了关闭按钮')    s.send("error1".encode('utf-8'))    exit(0)       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    server = ('10.100.207.40', 9999)s.connect(server)#建立连接t=tkinter.Tk()t.title("多人聊天室")t.geometry("300x200+500+200")l = tkinter.Label(t,text='多人聊天室欢迎您,请输入你的名称',width=40, height=8)l.pack()n = tkinter.StringVar()e = tkinter.Entry(t, width=15,textvariable = n)e.pack() rv1 = tkinter.StringVar()name = n.get()b = tkinter.Button(t, text="登录",width=40, height=10,command=Creat) b.pack()t.protocol("WM_DELETE_WINDOW", JieShu)t.mainloop()s.close()

六、实验数据记录和结果分析

1.服务器启动,等待客户机连接请求

2.客户端请求服务,客户端弹出登录窗口,输入用户名登录

3.服务器接收到请求,分配端口,并持续监听其他客户机的请求

4.客户端登陆后进入聊天窗口

5.进入聊天室的用户,发送消息,其他用户都可以接收到,服务器也能看到

6.客户机退出连接,其他用户都可以接收到,服务器也能看到

7.其他客户机可以中途进入聊天室

以上是"如何利用Python打造一个多人聊天室"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

客户 服务 服务器 客户端 聊天室 线程 消息 字典 客户机 端口 实验 代码 地址 用户 登录 多人 数据 界面 端的 输入 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 共筑网络安全宣传工作 网络安全作文好处600字 贵州学校时钟监控网关服务器 数据库primary满了 古斯塔斯安全储藏数据库 软件开发科技公司税负率 网络安全知识大比拼 宁夏智慧医养软件开发哪儿好 联想服务器右上角指示灯 网络信息安全和数据库的关系 app软件开发叫什么软件 对话山东网络安全 通过数据库可以学习什么 服务器ip分配是前端还是后端 优化网络安全技能 获取云数据库超过100条的数据 临沂18年软件开发招聘信息 京东 提交金数据库 如何提高服务器的响应时间 交通法律法规数据库 5e和完美服务器有什么区别 指挥中心网络安全应急预案 苹果设置里面的服务器是啥 国家安全对网络安全非常重视 软件开发领导小组 扬州职业大学计算机网络技术 龙族幻想服务器怎么升级 远程连接服务器安全策略 计算机网络技术应该干什么 登录ipad连接服务器出错
0