python scoket 多人聊天室 带界面

前言

本来是为了局域网内能够复制段儿代码方便远程调试用的,ssh当然也可以,当然还是我头脑风暴散发,想到这里了。于是从网上拉了一个,改通之后,留一个备份。

期望还是很好的,以后用来支持ubuntu聊天之类的,当然这就得在html上来,不急慢慢来

代码

服务端代码:

import socket
import time
from threading import Thread# 创建socket,绑定地址和端口号
host = '192.168.8.221'
port = 12345
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))  # 绑定地址和端口号# 存放用户昵称和地址
client = {}
address = {}
# 服务器可接收的client连接数
accept_num = 10def client_join(conn, add):  # 新客户端加入print("为新用户建立进程")nikename = conn.recv(1024).decode('utf8')welcome = f'欢迎{nikename}加入聊天室'print(welcome)client[conn] = nikename  # 将客户端加入clientbrodcast(bytes(welcome, 'utf8'))  # 广播欢迎信息while True:time.sleep(0.1)try:msg = conn.recv(1024)print(msg)brodcast(msg, nikename + ':')  # 广播聊天信息except:print("接收失败")conn.close()client[conn]=Nonebrodcast(bytes(f'{nikename}离开聊天室\n', 'utf8'))  # 用户断开连接def brodcast(msg, nikename=''):  # 向所有客户端广播新信息for conn in client:print(f"向{conn} 发送 {msg}")conn.send(bytes(nikename, 'utf8') + msg)print("发送成功")if __name__ == '__main__':s.listen(accept_num)print('服务器已开启,正在监听用户请求')while True:conn, add = s.accept()print(add, '已建立连接')conn.send('欢迎来到聊天室,请输入你的昵称后进行聊天\n'.encode('utf8'))address[conn] = addThread(target=client_join, args=(conn, add)).start()  # 为新连接的客户端建立新线程

客户端代码:

import socket
import traceback
from threading import Thread
import tkinter as tk# socket接入
host = '192.168.8.221'
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))def get_msg():global text_messagewhile True:try:msg = s.recv(1024).decode('utf8')print(f"得到了一些消息:{msg}")text_message.insert(tk.END, msg)  # 接收到广播信息时显示在消息窗口except (BaseException, Exception) as e:print(traceback.format_exc())break# 绘制GUI
app = tk.Tk()
app.title('多人聊天室')# 消息窗口
message_frame = tk.Frame(width=480, height=300, bg='white')  # 划分Frame
text_message = tk.Text(message_frame)
message_frame.grid(row=0, column=0, padx=3, pady=6)  # 0行0列,边框距离x=3px,y=6px
message_frame.grid_propagate(0)  # 固定面板大小
text_message.grid()# 输入窗口
text_frame = tk.Frame(width=480, height=100)
text_text = tk.Text(text_frame)
text_frame.grid(row=1, column=0, padx=3, pady=6)
text_frame.grid_propagate(0)
text_text.grid()# 发送按钮
def send():send_msg = text_text.get('0.0', tk.END)  # 获取输入窗口文本内容# print(send_msg)s.send(send_msg.encode())text_text.delete('0.0', tk.END)  # 清空输入窗口文本内容receive_thread = Thread(target=get_msg)  # 开启线程用于接收广播信息
receive_thread.start()
print('连接服务器成功')send_frame = tk.Frame(width=480, height=30)
button_send = tk.Button(send_frame, text='发送', command=send)  # 添加按钮并绑定发送功能
send_frame.grid(row=2, column=0, padx=10, sticky='E')  # 2行0列,右对齐,距离边框10px
# send_frame.grid_propagate(0)
button_send.grid()app.mainloop()

最后我也是复制粘贴修改的,也支持下原创:Python实战 | socket+thinter 实现多人聊天室_socket实现多人聊天室图片-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/222966.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024黑龙江省职业院校技能大赛暨国赛选拔赛“GZ034软件测试”赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ034软件测试”赛项规程 一、赛项信息 赛项类别 每年赛 隔年赛(单数年/双数年) 赛项组别 中等职业教育 高等职业教育 学生赛(个人/团体) 教师赛 师生同赛 涉及专业大类、…

IDEA的安装与删除插件

不小心安装了一个英文转中文的插件,看不习惯,决定重新变回英文 先点击这个settings的安装 然后就看到这个下面这张图了 如果是安装就点install,不用了就和我一样把这个勾给去掉

ESXi 添加新网络 配置ubuntu虚拟机双网卡

基本概念 在ESXi的虚拟机之间确保正常通信的基础是网络服务,通常在物理网络中需要使用不同的物理设备进行连接才能组建出高效的网络服务,而在虚拟网络中,需要不同的虚拟设备为其提供服务。 ESXi的网络类型: 1、物理网络&#xf…

智慧工厂人员定位系统源码,融合位置物联网、GIS可视化等技术,实现对人员、物资精确定位管理

智慧工厂人员定位系统源码,UWB高精度定位系统源码 随着中国经济发展进入新常态,在资源和环境约束不断强化的背景下,创新驱动传统制造向智能制造转型升级,越发成为企业生存发展的关键。智能工厂作为实现智能制造的重要载体&#xf…

如何在外远程访问本地NAS威联通QNAP?

🌈个人主页:聆风吟 🔥系列专栏:数据结构、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 威联通安装cpolar内网穿透二. 内网穿透2.1 创建隧道2.2 测试公网远程访问 三.…

Webpack——Webpack简介

1、什么是Webpack? Webpack是一个开源的JavaScript模块打包工具,其最核心的功能是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件(有时会有多个,这里讨论的只是最基本…

MySQL的Linux安装

在MySQL官网下载压缩包MySQL :: Download MySQL Community Server (Archived Versions) 下载完成后将压缩包上传到Linux中。我这里是下的CentOS的压缩包。 并且用的是FinalShell连接工具,可以选择压缩包直接上传。 ​ 上传完毕后,新建mysql文件夹&…

pinia从入门到使用

pinia: 比vuex更适合vue3的状态管理工具,只保留了vuex 原有的 state, getters,actions 作用等同于 data computed methods,可以有多个 state 1.安装创建导入 安装:npm install pinia 或 yarn add pinia 创建stores/index.js inde…

java springboot中使用 AOP监听方法执行周期

首先 我们在 pom.xml 中 dependencies标签中加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>然后 我们随便创建一个类 编写代码如下 package com.ex…

学习grdecl文件格式

一、初步了解 最近在学习grdecl文件格式&#xff0c;文档不多。查找资料发现&#xff0c;这个格式的文件是由斯伦贝谢公司的ECLIPSE专业软件生成的。 搜到一些文档&#xff0c;都是2010年之前的&#xff0c;似乎有些用处。文档也交代了这个文件格式分为二进制和文本格式…

设计问卷调查问题的技巧二:确定问题的结构与顺序

上篇文章中&#xff0c;我们了解到设计问卷调查问卷的技巧有保持问题中立、少用开放式问题、保持全名平衡的答案集、谨慎设置单一回答。在这篇文章中&#xff0c;我们将继续深入探讨设计问卷调查问题的剩余5大技巧&#xff01; Tip5&#xff1a;注意问题的顺序 虽然您可以任意…

Project DESFT 白皮书中文版——应用于普惠金融的可信数字凭证解决方案

1. 概述 Project DESFT 是由 Solv 基金会与 zCloak Network 联合设计孵化&#xff0c;以跨境贸易和金融服务为场景的分布式可信数字凭证解决方案&#xff08;Distributed Trusted Digital Credential Solution&#xff09;&#xff0c;项目获得新加坡金管局&#xff08;Monetar…