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发送http请求解析返回json的实例

    在Python中,我们可以使用requests库发送HTTP请求,并使用json库解析返回的JSON数据。以下是Python发送HTTP请求解析返回JSON的完整攻略,包含两个示例。 示例1:使用requests库发送HTTP请求并解析返回的JSON数据 以下是一个示例,可以使用requests库发送HTTP请求并解析返回的JSON数据: import re…

    python 2023年5月15日
    00
  • Python中函数带括号和不带括号的区别及说明

    Python中函数带括号和不带括号的区别及说明完整攻略: 1. 函数带括号和不带括号的区别 函数带括号和不带括号的主要区别在于它们执行的方式不同,带括号的函数是执行函数,不带括号的函数是函数对象。 函数带括号 函数带括号表示执行了该函数,通常情况下,带括号的函数可以采取两种形式: 一种是调用函数时没有传递参数,此时函数会使用默认参数进行执行; 另一种是调用函…

    python 2023年6月5日
    00
  • python 爬虫 实现增量去重和定时爬取实例

    Python爬虫:实现增量去重和定时爬取实例 1. 增量去重(Incremental Scraping) 在进行爬取时,我们可能会遇到已经爬取过的网页,但是网页内容并没有更新的情况。这时,如果我们还对这些页面进行爬取,不仅会浪费时间和资源,而且会导致重复的数据。 针对这种情况,我们可以使用增量去重技术,即只爬取新产生的数据,跳过已经存在的数据,达到提高效率和…

    python 2023年5月14日
    00
  • Python中的chr()函数与ord()函数解析

    Python中的chr()函数与ord()函数解析 chr()函数 在 Python 中,chr() 函数用于将 Unicode 码点转换为字符。Unicode 码点是一个整数,用于表示字符的独特标识符。此函数的语法为: chr(i) 其中 i 代表 Unicode 码点。 下面是一个示例,演示了如何使用 chr() 函数将 Unicode 码点转换为字符:…

    python 2023年5月31日
    00
  • Python实战之实现获取动态图表

    Python实战之实现获取动态图表 1. 确定获取的数据来源 首先需要确定所要获取的数据来源,可以是某个网站上的数据或者是从API中获取的数据。 2. 安装必要的Python库 在Python中获取动态图表数据需要使用一些必要的库,例如matplotlib和selenium。可以使用pip命令安装它们。 pip install matplotlib sele…

    python 2023年6月3日
    00
  • 详解Python获取线程返回值的三种方式

    当我们在Python程序中使用多线程的时候,有时候我们需要获取线程返回的结果。本次攻略将讲解三种获取线程返回值的方式。 方式一:使用Thread.join()方法等待线程结束并获取返回值 Thread.join()方法可以阻塞主线程,等待子线程结束后才会继续执行。使用此方法可以等待子线程返回值,代码示例如下: import threading def tas…

    python 2023年5月19日
    00
  • Python创建二维数组实例(关于list的一个小坑)

    以下是详细讲解“Python创建二维数组实例(关于list的一个小坑)”的完整攻略。 在Python中,可以使用列表(list)来创建二维数组。但是,需要注意的是,Python中的列表是可以存储不同类型的元素,因此在创建二维数组时,需要注意列表中每个元素的类型。下面是一些常见创建二维数组的方法。 方法一:使用列表推导式 matrix = [[0 for i …

    python 2023年5月13日
    00
  • Python如何发送与接收大型数组

    要发送和接收大型数组,可以使用Python内置的socket库来进行网络通信。下面是操作步骤的完整攻略: 步骤一:建立连接并发送数组 首先,需要在发送方(客户端)上创建一个socket对象。 import socket # 创建一个socket对象 client_socket = socket.socket(socket.AF_INET, socket.SO…

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