Python网络编程基于多线程实现多用户全双工聊天功能示例

yizhihongxing

Python网络编程基于多线程实现多用户全双工聊天功能示例

什么是Python网络编程?

Python网络编程是指使用Python语言编写网络应用程序的技术。在Python网络编程中,使用Python标准库中的socket库来实现网络通信,通过socket库提供的接口,可以在不同的计算机之间建立连接,传输数据等。

多线程实现多用户全双工聊天功能

使用多线程可以实现多个用户同时聊天的功能,同时支持全双工通信,即不同用户之间可以同时发送和接收消息。

下面是一个示例代码:

import socket
import threading

# 服务器配置
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 8000
BUFSIZ = 1024

# 创建socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(5)
print('Server listening on {}:{}'.format(SERVER_HOST, SERVER_PORT))

# 保存连接的客户端socket列表
clients = []

# 处理客户端socket的函数
def handle_client(client_socket):
    while True:
        try:
            # 接收消息
            msg = client_socket.recv(BUFSIZ)
            if not msg:
                # 客户端断开连接
                print('Client disconnected')
                clients.remove(client_socket)
                client_socket.close()
                break
            # 广播消息给其他所有客户端
            for client in clients:
                client.send(msg)
        except Exception as e:
            print('Socket error: {}'.format(str(e)))

# 主循环,接受客户端连接
while True:
    client_socket, client_address = server_socket.accept()
    print('New client connected: {}:{}'.format(client_address[0], client_address[1]))
    clients.append(client_socket)
    # 创建一个新的线程处理客户端socket
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()

在此示例中,我们首先创建服务器socket并绑定到指定的HOST和PORT,然后使用listen方法等待客户端连接。

一旦有客户端连接进来,服务器就会创建一个新的线程来处理该客户端socket,同时将客户端socket保存到clients列表中,方便后续广播消息给所有客户端。

handle_client函数的实现非常简单,它负责处理特定客户端的所有通信。在一个无限循环中,它首先使用recv方法接收客户端发送的消息,如果接收到消息为空,就说明客户端已经断开连接,我们可以将其socket从clients列表中移除并关闭该socket,同时退出循环。否则,将收到的消息广播给clients列表中的所有其他客户端。

这种方式可以让我们实现一个简单的多用户全双工聊天应用。

示例说明

示例一:客户端和服务器在同一台机器上

假设我们已经在本地机器上搭建了一个TCP服务器,IP地址为127.0.0.1,端口号为8000。现在我们需要使用一个客户端连接到该服务器并进行聊天。

import socket

SERVER_HOST = '127.0.0.1'
SERVER_PORT = 8000
BUFSIZ = 1024

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))

while True:
    msg = input('Enter message to send:')
    client_socket.send(bytes(msg, 'utf-8'))
    data = client_socket.recv(BUFSIZ)
    print('Received from server:', data.decode('utf-8'))

在上面的代码中,我们创建了一个新的客户端socket,并使用connect方法连接到指定的服务器,之后进入一个无限循环中,等待用户输入消息并将其发送给服务器。接着等待服务器发送回应,在控制台输出收到的消息。

示例二:客户端和服务器在不同的机器上

假设我们需要在两台机器之间进行聊天,一台机器作为服务器,另一台机器作为客户端。假设服务器的IP地址是192.168.0.100,端口号为8000,客户端的IP地址是192.168.0.101。以下是客户端的示例代码:

import socket

SERVER_HOST = '192.168.0.100'
SERVER_PORT = 8000
BUFSIZ = 1024

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))

while True:
    msg = input('Enter message to send:')
    client_socket.send(bytes(msg, 'utf-8'))
    data = client_socket.recv(BUFSIZ)
    print('Received from server:', data.decode('utf-8'))

客户端的代码与示例一的代码相同,唯一的区别是SERVER_HOST变量的值。

服务器的代码与示例一的代码相同,唯一的区别在于通过主机名或IP地址来指定绑定的HOST。

import socket
import threading

# 服务器配置
SERVER_HOST = '0.0.0.0'  # 这里使用0.0.0.0表示可以绑定任意IP地址
SERVER_PORT = 8000
BUFSIZ = 1024

# 创建socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(5)
print('Server listening on {}:{}'.format(SERVER_HOST, SERVER_PORT))

# 保存连接的客户端socket列表
clients = []

# 处理客户端socket的函数
def handle_client(client_socket):
    while True:
        try:
            # 接收消息
            msg = client_socket.recv(BUFSIZ)
            if not msg:
                # 客户端断开连接
                print('Client disconnected')
                clients.remove(client_socket)
                client_socket.close()
                break
            # 广播消息给其他所有客户端
            for client in clients:
                client.send(msg)
        except Exception as e:
            print('Socket error: {}'.format(str(e)))

# 主循环,接受客户端连接
while True:
    client_socket, client_address = server_socket.accept()
    print('New client connected: {}:{}'.format(client_address[0], client_address[1]))
    clients.append(client_socket)
    # 创建一个新的线程处理客户端socket
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()

注意,这里的SERVER_HOST变量是绑定到服务器网卡的IP地址。如果服务器有多个网卡,您需要确定要使用哪个IP地址来绑定,才能实现正确的通信。

综上所述,本文介绍了Python网络编程中基于多线程实现多用户全双工聊天功能的实现方法,并提供了两个示例说明。通过这些示例,您可以快速掌握Python网络编程的基本技巧,为您的网络编程之旅打下坚实的基础。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python网络编程基于多线程实现多用户全双工聊天功能示例 - Python技术站

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

相关文章

  • 基于Python对数据shape的常见操作详解

    基于Python对数据shape的常见操作详解 在数据科学领域中,我们通常会遇到需要对数据进行整理和转换的情况,数据整理和转换工作直接关乎我们建模或者分析的结果。而数据的shape信息就是其中一个非常重要的维度。在本文中,我们将通过Python演示数据shape的常见操作,希望能够对读者在数据处理过程中有所帮助。 reshape数据的重塑 重塑数据是数据整理…

    python 2023年6月6日
    00
  • Python中常用数据类型使用示例概括总结

    以下是“Python中常用数据类型使用示例概括总结”的完整攻略。 1. Python中常用的数据类型 在Python中常用的数据类型包括整数、浮点数、字符串、列表、元组、字典和集合等。以下是这些数据类型的简要介绍: 整数:表示整数,例如1、2、3等。 浮点数:表示带有小数点的数,例如1.0、2.5、3.14等。 字符串:表示文本,例如”hello””worl…

    python 2023年5月13日
    00
  • python如何使用contextvars模块源码分析

    下面是详细的Python如何使用contextvars模块源码分析攻略。 1. 翻阅文档 首先,我们需要查阅Python的官方文档,了解contextvars模块的基本用法和重要概念。同时,我们要熟悉与contextvars相关的其他模块和函数,如 asyncio, inspect 和 threading 等。 可以在 Python 官方文档中查阅 cont…

    python 2023年6月3日
    00
  • 详解Linux中文乱码问题终极解决方法

    下面是详细的解析: 一、问题描述及分类 在Linux操作系统中经常会遇到中文乱码的情况,这是因为Linux操作系统默认使用UTF-8编码方式,而中文文本中可能会包含GB2312、BIG5等其他编码方式,因此在进行中文文本的输入、输出以及文件传输过程中,就会出现乱码的情况。 在Linux系统中的中文乱码问题,主要分为以下3种情况: 终端中文乱码:在终端中输入中…

    python 2023年5月20日
    00
  • 一文搞懂Python中列表List和元组Tuple的使用

    Python 中列表(List)和元组(Tuple) 在 Python 中,列表和元组都是序列类型,具有一些相似的操作。但是它们的性质不同,我们需要正确地选择它们来存储和操作数据。下面我们来一步步地介绍这两种序列类型的性质和使用方法。 列表(List) 列表是一种可变序列类型。它的每个元素可以是不同类型的对象,列表内的元素可以随意地进行添加、删除和修改。 创…

    python 2023年6月3日
    00
  • Python实现语音识别和语音合成功能

    Python实现语音识别和语音合成功能 简介 语音识别和语音合成技术是人机交互领域非常重要的一部分,Python作为广受欢迎的编程语言之一,具有丰富的语音处理库和工具,可以用来实现语音识别和语音合成功能。 实现流程 语音识别 语音识别是将语音转换为文本的过程,一般分为以下几个步骤: 获取语音输入 对语音进行预处理,如去除噪音等 将预处理后的语音转换成数字信号…

    python 2023年5月19日
    00
  • 输入函数时Python代码不起作用

    【问题标题】:Python code not working when entered into function输入函数时Python代码不起作用 【发布时间】:2023-04-08 01:00:02 【问题描述】: 我是 Python 新手,我正在处理一些 tar 文件。以下示例有效: #!/usr/bin/python import os, readl…

    Python开发 2023年4月8日
    00
  • python基础操作列表切片解析

    以下是“Python基础操作列表切片解析”的完整攻略。 1. 什么是列表切片 列表切片是Python中一种用于获取中部分元素的方法。它的语法形式为: list[start:end:step] 其中,list是一个列表,start是起位置,end是结束位置,step是步长。 列表切片的作用是获取列表中从起始位置到结束位置之间的元素,步长step。 2. 列表切…

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