【python】基于Socket的聊天室Python开发
基于Socket的聊天室Python开发
- 一、Socket简述
- 二、创建服务端Server
- 2.1 创建服务端初始化
- 2.2 监听客户端连接
- 2.3 处理客户端消息
- 三、创建客户端Client
- 3.1 创建服务端初始化
- 3.2 发送消息
- 3.3 接收消息
- 3.3 线程工作
- 3.4 线程工作
- 是不是挺好玩的呢?也可以作为课程设计哦!如果需要源码,可以关注我弓中皓查看历史文章。
(关注“测试开发自动化” 弓中皓,获取更多学习内容)
一、Socket简述
SOCKET它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
Socket的主要的工作模式如下:

我们就用上面的模式,来开发一个聊天室工具,主要的开发模块包括两部分:
- 客户端开发
- 服务端开发
可以部署在同一电脑上,由于我只有一台电脑,所以我将服务端和客户端都部署在了我自己的电脑上。你也可以部署在同一局域网的不同电脑上,或使用其他的不同服务器进行部署,效果展示:

如果你们公司的网络是不允许接入互联网的,那么你可以偷偷做一个局域网内的聊天小软件,用于你跟心爱的女孩子之间聊天。哈哈哈哈。。
二、创建服务端Server
创建服务端的流程大致可以分为以下几个步骤:
1)创建客户端套接字(socket)对象
2)绑定IP地址和端口号
3)设置监听
4)等待接受客户端的连接请求
5)接受数据
6)发送数据
7)关闭客户端套接字(socket)
2.1 创建服务端初始化
该部分主要用于初始化服务端,创建一个Severt类,它不断监听客户端的发送的请求。
class Server:def __init__(self):self.server = socket.socket() # 创建客户端套接字(socket)对象self.server.bind(("192.168.20.164", 8989)) # 绑定IP地址和端口号self.server.listen(15) # 设置监听 15表示服务端等待排队连接的最大数量self.clients = [] # 用于存放客户端的响应信息self.clients_name_ip = {} # 用与存放客户端名称与IPself.get_conn() # 监听客户端连接
2.2 监听客户端连接
通过设置一个死循环, 让我们的服务端不断处于监听客户端的连接请求。一旦客户端发起一个连接请求,accept()方法会返回当前连接的客户端的socket连接对象和IP地址。
通过 print(cilent),可以看到:
<socket.socket fd=460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.20.164', 8989), raddr=('192.168.20.164', 59239)>
此时,服务器会向客户端输入一条信息data,服务端需要将该信息编码encode,发送给客户端。同时,客户端接收到该信息后,需要将其节码,才能转为我们可以识别的内容。
def get_conn(self):while True:client, address = self.server.accept() # 等待接收连接请求print("IP为{}的使用者正在请求连接。".format(address))data = "与服务器链接成功,请输入昵称才可以聊天"client.send(data.encode()) # server与client通信,send() decodeself.clients.append(client) # 链接用户添加到服务器的用户列表Thread(target=self.get_msg, args=(client, self.clients,self.clients_name_ip, address)).start()
2.3 处理客户端消息
为将发送的名称与IP进行绑定,需要将客户端发送的用户名内容解码,追加到clients_name_ip参数中。此时,一旦客户端发来连接请求,并输入了昵称,那么昵称就会被解码存储在name变量中。
此时,服务端开始循环监听该客户端的消息。并且不断将客户端发来的消息进行解码。并将消息通过for循环的形式,重新编码发送给所有的客户端。
另外,如果检测到客户端发来的消息是一个"Q"字符,那么客户端就会被关闭。
def get_msg(self, client, clients, clients_name_ip, address):name = client.recv(1024).decode() # 接受客户端发来的昵称print("昵称:【{}】 设置成功".format(name))clients_name_ip[address] = name # 昵称与IP进行绑定while True: # 循环监听客户端消息try:recv_data = client.recv(1024).decode()except Exception as e:self.close_client(client, address)break# 入=如果用户输入Q,推出if recv_data.upper() == "Q":self.close_client(client, address)breakfor c in clients:c.send((clients_name_ip[address] + " " + time.strftime("%x")+"\n"+recv_data).encode())
三、创建客户端Client
创建客户端的流程大致可以分为以下几个步骤:
1)创建客户端套接字(socket)对象
2)和服务器端套接字(socket)建立连接
3)发送数据
4)接受数据
5)关闭客户端套接字(socket)
3.1 创建服务端初始化
客户端采用PyQT5,将客户端做成界面的形式进行交互。这里不对PyQT5做过多的解释。此处讲解使用的PyQT5比较简单,重点对服务端socket开发进行讲解。
首先,创建客户端socket对象,并连接服务器端口,并开启工作线程。
class Client(QWidget):def __init__(self):super(Client, self).__init__()self.setGeometry(600, 300, 360, 300)self.setWindowTitle("聊天室")self.add_ui() # 界面UI,这个跟socket无关self.client = socket.socket() # 与服务器链接self.client.connect(("127.0.0.1", 8989))self.work_thread() # 调用线程
3.2 发送消息
发送消息通过的是用户点击发送按钮,点击发送按钮以后,QT会以信号的形式触发执行send_msg函数。至此,消息会被解码发送给服务器,如果检测到发送消息是字符‘Q’,那么客户端会被退出。
def btn_send(self): # 发送按钮点击,信号发射self.button.clicked.connect(self.send_msg)
def send_msg(self): # 检测到发送按钮点击,该客户端就会向服务端发送数据msg = self.message.text()self.client.send(msg.encode())if msg.upper() == "Q":self.client.close()self.destroy()self.message.clear()
3.3 接收消息
通过接收消息,将接收后的消息解码,通过append的形式追加到QT的控件中,用于在界面中显示
def recv_msg(self):while True:try:data = self.client.recv(1024).decode()print(data)data = data + "\n"self.content.append(data)except:exit()
3.3 线程工作
通过调用该方法,来启动发送消息线程、接收消息线程。
def work_thread(self):Thread(target=self.btn_send).start() # 发送消息Thread(target=self.recv_msg).start()
3.4 线程工作
第一步:启动服务器Server
第二步:启动一个Client (pycharm)
第三步:再启动一个Client (cmd)

是不是挺好玩的呢?也可以作为课程设计哦!如果需要源码,可以关注我弓中皓查看历史文章。
(关注“测试开发自动化” 弓中皓,获取更多学习内容)
相关文章:
【python】基于Socket的聊天室Python开发
基于Socket的聊天室Python开发一、Socket简述二、创建服务端Server2.1 创建服务端初始化2.2 监听客户端连接2.3 处理客户端消息三、创建客户端Client3.1 创建服务端初始化3.2 发送消息3.3 接收消息3.3 线程工作3.4 线程工作是不是挺好玩的呢?也可以作为课程设计哦&a…...
2023想转行软件测试的看过来,你想要了解的薪资、前景、岗位方向、学习路线都讲明白了
在过去的一年中,软件测试行业发展迅速,随着数字化技术应用的广泛普及,业界对于软件测试的要求也在持续迭代与增加。 同样的,有市场就有需求,软件测试逐渐成为企业中不可或缺的岗位,作为一个高薪又需求广的…...
TortoiseSVN的使用
基本概念 版本库 SVN保持数据的地方,所有的文件都保存在这个库中,Tortoise访问的就是远程服务器上的Subversion版本库。 工作拷贝 就是工作副本,可将版本库的文件拷贝到本地中,可以任意修改, 不会影响版本库。在你…...
操作系统(day09) -- 连续分配管理方式
连续分配管理方式 单元连续分配 动态分区分配 1.系统要用什么样的数据结构记录内存的使用情况? 两种常用的数据结构 空闲分区表 每个空闲分区对应一个表项。表项中包含分区号、分区大小、分区起始地址等信息空闲分区链 每个分区的起始部分和末尾部分分别设置前向…...
APISpace 带你一起走进西湖美景
俗话说:“上有天堂,下有苏杭”。 “欲把西湖比西子,浓妆艳抹总相宜” 今天我就带大家走进杭州的西湖美景。自古以来,文人歌者面对西湖美景留下千古绝句,还以西湖为背景书写了一段段动人的爱情传说。 天生自带浪漫色…...
傻白探索Chiplet,Design Space Exploration for Chiplet-Assembly-Based Processors(十三)
阅读了Design Space Exploration for Chiplet-Assembly-Based Processors这篇论文,是关于chiplet设计空间探索的,个人感觉核心贡献有两个:1.提出使用整数线性规划算法进行Chiplet的选择;2.基于RE和NRE提出了一个cost模型ÿ…...
系统分析师真题2020试卷相关概念一
对象系统测试的基本概念: 面向对象系统的单元测试包括方法层次的测试、类层次的测试和类树层次的测试。方法层次的测试类似于传统软件测试中对单个函数的测试; 测试技术: 方法层次的测试,单个函数的测试;常用的技术:等价类划分测试、组合功能测试、递归函数的测试和多态…...
20230215_数据库过程_渠道业务计算过程
—20221209 渠道产能 —自有人员工号表 shzc.xc_qdcn_pgtx_opertype —select * from shzc.xc_qdcn_pgtx_opertype for update ; —渠道基础目录 shzc.xc_qdcn_pgtx_qdtype —select * from shzc.xc_qdcn_pgtx_qdtype for update ; SQL_STRING:‘update shzc.xc_qdcn_pgtx_q…...
【C++】Expression的学习笔记
关于不同类别表达式的举例,请参考博文《C 中的值类别》 1. 左值和右值的简单理解 左值对应了具有内存地址的对象,而右值仅仅是临时使用的值对象。(引用自博文《C 中的值类别》)左值有名称(变量或常量名称)…...
[数据库迁移]-MySQL常见问题
[数据库迁移]-MySQL常见问题 森格 | 2023年2月 介绍:记录在MySQL数据库迁移过程中遇到的问题,以及解决方案。 文章目录[数据库迁移]-MySQL常见问题一、背景二、常见问题2.1 ERROR 20032.2 ERROR 12732.3 ERROR 10712.4 视图权限2.5 ERROR 1062三、总结一…...
C语言编译过程
C语言编译过程1、C语言编译过程2、单c文件编译实践3、多c文件编译实践4、define4.1、不带参宏4.2、带参宏4.3、带参宏和带参函数的区别5、选择性编译ifdef、ifndef、if5.1、#ifdef5.2、#ifndef5.3、#if6、静态库和动态链接库6.1、静态库实践6.1.1、将mylib.c制作成静态库6.1.2、…...
前端学习 ---常用标签
常用标签 1,文本标签 文本标签是双标签,自带加粗效果,有自己对应的文本大小,并且独占一行,有默认间距 一级标签:< h1 > < /h1 > 二级标签:< h2 > < /h2> 三级标签:&l…...
2023年PMP考试难不难?
整个考试的考察方向转向还是比较大的,基本上以“价值传递”和“以人为本”这两个出发点来考察项目经理所需要的能力。 1}新版提纲题目数量的变化 总题量从200道减少到180道,所以答题时间上相对变的宽裕一些。考试时间230分钟,中间有十分钟休…...
Netty 入门
文章目录一、概述1.1 Netty 是什么?1.2 Netty 的地位1.3 Netty 的优势二、Hello World2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理三、组件3.1 EventLoop3.2 演示 NioEventLoop 处理 io 事件3.3 演示 NioEventLoop 处理普通任务3.4 演示 NioEventLoop 处理定时任务…...
收藏|一文掌握数据分析在企业的实际流程
一、数据分析概念 1.1 数据分析 是指用适当的统计分析方法对收集来的大量数据进行分析,将他们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用。 1.2 数据分析包括 描述性数据分析(初级数据分析)…...
100ask_imx6ull 输出PWM
查看PWM对应扩展板的引脚 100ask_imx6ul通过扩展板插槽来验证pwm波,所以这里通过扩展板的原理图及芯片手册可知,gpio4_io20,gpio4_io19分别对应着PWM8和PWM7。 设置设备树 打开官方NXP的工具i.MX pins v6工具,PWM7/PWM8的配置如…...
yolov5编译安卓APP:解决图像上全是检测框
yolov5编译安卓APP:解决图像上全是检测框前言一、第一个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法二、第二个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法三、其他1.APK打包2.修改APP图标与名字前言 YOLOv5编译安卓A…...
为什么我们需要地图?
想一想,武侠小说里面。一张藏宝图,引来江湖腥风血雨,要么是武功秘籍,要么是绝世宝剑,要么是富可敌国的财富,只要有了藏宝图,便可曲径通幽,到达彼岸。 由此可见,地图的重…...
攻防世界1.新手练习区
4.攻防世界1.新手练习区 1.view_source 访问url: http://111.200.241.244:48855/ 鼠标点击右键不起作用,F12审查元素 得到flag为cyberpeace{0f3a3e4ab8c8664f3cf40d4240ec7b53} 2.robots 访问url: http://111.200.241.244:34362/ rob…...
Python进阶篇(二)-- Django 深入模型
上一节提到了Django是基于MVC架构的Web框架,MVC架构追求的是“模型”和“视图”的解耦合。所谓“模型”说得更直白一些就是数据(的表示),所以通常也被称作“数据模型”。在实际的项目中,数据模型通常通过数据库实现持久…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
AI书签管理工具开发全记录(十八):书签导入导出
文章目录 AI书签管理工具开发全记录(十八):书签导入导出1.前言 📝2.书签结构分析 📖3.书签示例 📑4.书签文件结构定义描述 🔣4.1. 整体文档结构4.2. 核心元素类型4.3. 层级关系4.…...
