【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)

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

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


相关文章
|
21天前
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
141 82
|
25天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
64 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
4天前
|
人工智能 自然语言处理 程序员
用通义灵码开发一个Python时钟:手把手体验AI程序员加持下的智能编码
通义灵码是基于通义大模型的AI研发辅助工具,提供代码智能生成、研发问答、多文件修改等功能,帮助开发者提高编码效率。本文通过手把手教程,使用通义灵码开发一个简单的Python时钟程序,展示其高效、智能的编码体验。从环境准备到代码优化,通义灵码显著降低了开发门槛,提升了开发效率,适合新手和资深开发者。最终,你将体验到AI加持下的便捷与强大功能。
|
13天前
|
存储 API 数据安全/隐私保护
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
52 6
|
21天前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
210 9
|
25天前
|
人工智能 测试技术 数据处理
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
122 11
|
1月前
|
API Python
python泛微e9接口开发
通过POST请求向指定IP的API注册设备以获取`secrit`和`spk`。请求需包含`appid`、`loginid`、`pwd`等头信息。响应中包含状态码、消息及`secrit`(注意拼写)、`secret`和`spk`字段。示例代码使用`curl`命令发送请求,成功后返回相关信息。
45 5
|
5月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
51 0
|
8月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
95 4
|
8月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
49 3

热门文章

最新文章