【python】基于Socket的聊天室Python开发

简介: 【python】基于Socket的聊天室Python开发

(关注“测试开发自动化” 公众号,后台回复:聊天室源码,获取更多学习内容)

一、Socket简述

SOCKET它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

Socket的主要的工作模式如下:

我们就用上面的模式,来开发一个聊天室工具,主要的开发模块包括两部分:

  1. 客户端开发
  2. 服务端开发

可以部署在同一电脑上,由于我只有一台电脑,所以我将服务端和客户端都部署在了我自己的电脑上。你也可以部署在同一局域网的不同电脑上,或使用其他的不同服务器进行部署,效果展示:

如果你们公司的网络是不允许接入互联网的,那么你可以偷偷做一个局域网内的聊天小软件,用于你跟心爱的女孩子之间聊天。哈哈哈哈。。

二、创建服务端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 = {} # 用与存放客户端名称与IP  self.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() decode  self.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)  break  for 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)

是不是挺好玩的呢?也可以作为课程设计哦!如果需要源码,可以关注我弓中皓查看历史文章。

(关注“测试开发自动化” 公众号,后台回复:聊天室源码,获取更多学习内容)


相关文章
|
3月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
2月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
394 7
|
2月前
|
存储 安全 固态存储
基于C#实现的支持文件传输的Socket聊天室
基于C#实现的支持文件传输的Socket聊天室
214 5
|
3月前
|
算法 程序员 API
电商程序猿开发实录:淘宝商品python(2)
本文分享了开发者在对接淘宝商品详情API过程中的真实经历,涵盖权限申请、签名验证、限流控制、数据解析及消息订阅等关键环节,提供了实用的Python代码示例,帮助开发者高效调用API,提升系统稳定性与数据处理能力。
|
4月前
|
数据采集 存储 数据库
Python爬虫开发:Cookie池与定期清除的代码实现
Python爬虫开发:Cookie池与定期清除的代码实现
|
5月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
587 1
|
5月前
|
存储 算法 数据可视化
用Python开发猜数字游戏:从零开始的手把手教程
猜数字游戏是编程入门经典项目,涵盖变量、循环、条件判断等核心概念。玩家通过输入猜测电脑生成的随机数,程序给出提示直至猜中。项目从基础实现到功能扩展,逐步提升难度,适合各阶段Python学习者。
310 0
|
5月前
|
数据采集 存储 监控
抖音直播间采集提取工具,直播间匿名截流获客软件,Python开发【仅供学习】
这是一套基于Python开发的抖音直播间数据采集与分析系统,包含观众信息获取、弹幕监控及数据存储等功能。代码采用requests、websockets和sqlite3等...
|
网络协议 Python Java
小小聊天室 Python实现
相对于Java方式的聊天室,Python同样可以做得到。而且可以做的更加的优雅。想必少了那么多的各种流的Python Socket,你一定会喜欢的。 至于知识点相关的内容,这里就不多说了。
830 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
259 102
下一篇