python3实现多线程聊天室

Python3实现多线程聊天室主要涉及到socket编程和多线程编程两个方面。下面是实现的完整攻略:

  1. 创建Socket服务器

我们需要使用Python的socket模块,这个模块用来创建套接字对象,并提供了一系列接口来进行网络通信。

首先,需要使用socket()函数来创建一个套接字对象,并指定使用的网络协议(IPV4或IPV6)和套接字类型(UDP或TCP),一般使用TCP协议来创建聊天室服务器。

import socket

# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_socket.bind(('localhost', 9999)) 

# 设置最大连接数
server_socket.listen(5)
  1. 监听客户端连接

当有客户端想要连接聊天室服务器时,使用accept()函数来接受客户端连接请求,并返回一个新的套接字对象,用于客户端和服务器之间的通信。

while True:
    # 等待客户端连接
    client_socket, addr = server_socket.accept()

    # 创建一个线程用于处理客户端的消息
    threading.Thread(target=message_handle, args=(client_socket,)).start()
  1. 处理客户端消息

当有客户端连上服务器之后,需要使用recv()函数来接受客户端发送的消息,并使用send()函数将消息发送给其他客户端。

def message_handle(client_socket):
    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)
  1. 客户端维护

在处理客户端消息的时候,需要同时维护一个客户端列表,用于记录当前连接上服务器的所有客户端。

# 记录客户端连接
CLIENT_LIST = []

def message_handle(client_socket):
    global CLIENT_LIST

    # 将客户端套接字添加到客户端列表中
    CLIENT_LIST.append(client_socket)

    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)

    # 关闭套接字
    client_socket.close()
  1. 完整代码
import socket
import threading

# 记录客户端连接
CLIENT_LIST = []

# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_socket.bind(('localhost', 9999)) 

# 设置最大连接数
server_socket.listen(5)

def message_handle(client_socket):
    global CLIENT_LIST

    # 将客户端套接字添加到客户端列表中
    CLIENT_LIST.append(client_socket)

    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)

    # 关闭套接字
    client_socket.close()

while True:
    # 等待客户端连接
    client_socket, addr = server_socket.accept()

    # 创建一个线程用于处理客户端的消息
    threading.Thread(target=message_handle, args=(client_socket,)).start()

示例1:多客户端在同一时刻向服务器发送消息

启动服务器后,打开两个终端分别连接聊天室服务器。在任一终端中输入消息,可以在另一终端看到同样的消息。

示例2:服务器记录聊天日志

在服务器的代码中,可以新增一个日志功能来记录聊天的情况,如下所示:

def message_handle(client_socket):
    global CLIENT_LIST

    # 将客户端套接字添加到客户端列表中
    CLIENT_LIST.append(client_socket)

    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 记录聊天日志
        with open('chat_log.txt', 'a') as f:
            f.write(message.decode('utf-8'))

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)

    # 关闭套接字
    client_socket.close()

在服务器的运行目录下,会新增一个chat_log.txt文件用于记录聊天的内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3实现多线程聊天室 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • python rsa 加密解密

    关于 Python RSA 加密解密的完整攻略包括以下几个方面: 简介和原理 安装 RSA 库 生成 RSA 密钥对 加密和解密 示例 接下来,我将会一一解释。 1. 简介和原理 RSA 是一种非对称加密算法,是由 Ron Rivest、Adi Shamir 和 Leonard Adleman 发明的。在 RSA 算法中,通过使用一对密钥(公钥和私钥)来进行…

    python 2023年5月20日
    00
  • 一篇文章教你用Python绘画一个太阳系

    一篇文章教你用Python绘画一个太阳系 在这篇文章中,我们将使用Python编程语言实现绘制太阳系的功能,主要包括以下几个部分: 绘制太阳 绘制行星 绘制运动轨迹 动画演示 绘制太阳 首先,我们需要导入Python中的matplotlib库,它可以用于各种类型的科学绘图。 import matplotlib.pyplot as plt 接下来,我们定义一个…

    python 2023年5月19日
    00
  • 如何在Python中对文件进行操作

    当我们需要在Python中读取、写入、删除文件时,我们可以使用一些内置的函数和模块来实现。 打开文件 我们可以使用内置函数open()打开一个文件。open()函数接收两个参数:文件名和模式。模式有很多种,例如读取模式(r)、写入模式(w)、追加模式(a)等等。以下是一些示例: # 以读取模式打开文件 file = open("filename.t…

    python 2023年6月5日
    00
  • Python中使用tarfile压缩、解压tar归档文件示例

    下面是Python中使用tarfile压缩、解压tar归档文件的攻略。 介绍tarfile模块 Python中的tarfile模块可以用于创建、读取、写入.tar文件和.tar.gz文件等归档文件。常用的类有tarfile.TarFile,tarfile.TarInfo等。 tarfile压缩tar归档文件 使用tarfile模块压缩tar归档文件只需要以下…

    python 2023年6月3日
    00
  • 使用Python操作excel文件的实例代码

    我为你提供一份完整的使用Python操作Excel文件的实例代码教程。 环境准备 在操作Excel文件前需要安装Python第三方库openpyxl,使用pip命令安装即可。 pip install openpyxl 打开Excel文件 打开本地的Excel文件并读取其中的数据内容。 import openpyxl # 打开文件 workbook = ope…

    python 2023年5月13日
    00
  • linecache模块加载和缓存文件内容详解

    下面是关于“linecache模块加载和缓存文件内容详解”的完整攻略,包括使用方法和示例说明。 简介 linecache模块是Python标准库提供的一个用于缓存文件内容的模块。它的作用是对于一个文本文件,预先缓存其内容并记录每一行的偏移量,从而可以快速地访问文本文件中的任意一行内容,提高文件处理的效率。 模块导入 linecache模块是Python标准库…

    python 2023年5月13日
    00
  • 详解Python PIL Image.histogram()

    Python PIL 是Python的一个图像处理模块,包含了一系列图像处理操作,其中 Image.histogram()是其中一个常用函数,用于生成一幅图像的直方图,下面详细介绍该函数的用法: Image.histogram() 函数的简介 Image.histogram() 函数用于将一幅图像转为一维直方图,直方图的每一个数据表示一个像素值的数量。比如一…

    python-answer 2023年3月25日
    00
  • Python中用format函数格式化字符串的用法

    当我们需要输出一段字符串并选择性的插入一些变量值时,我们可以使用字符串格式化来达到这个目的。在 Python 中,字符串格式化可以通过使用 format 函数来实现。 什么是 format 函数? format 函数是一种字符串格式化的方法,可以让我们方便地将变量插入到字符串中。 格式: string.format(arguments) 其中, string…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部