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

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中字符串的基础介绍及常用操作总结

    Python中字符串的基础介绍及常用操作总结 什么是字符串 在Python中,字符串是一种序列类型,用来表示文本信息。它们被创建为一个包含单个或多个字符的序列,然后可以使用各种操作来处理和操作这些字符串。 在Python中,字符串可以使用单引号,双引号或三引号来创建。以下示例演示如何定义一个字符串: # 使用单引号 string1 = ‘Hello, wor…

    python 2023年6月5日
    00
  • 在python中的socket模块使用代理实例

    在Python中,如果需要通过代理(proxy)访问网络资源,可以使用socket模块进行操作。下面是在Python中使用socket模块使用代理的完整攻略。 1. 安装socks模块 在Python中,使用代理可以通过第三方库soscks实现,在使用之前需要安装soscks模块。 安装方式: pip install pysocks 2. 导入所需的模块 使…

    python 2023年6月3日
    00
  • 学习Python爬虫前必掌握知识点

    学习Python爬虫前必掌握知识点,包括以下几个方面: 1. Python基础知识 Python是一门高级编程语言,支持多种编程范式。在学习Python爬虫前,需要掌握Python的基础语法,包括但不限于: 变量的定义与使用 数据类型(数字、字符串、列表、字典、元组等) 条件语句与控制结构(if-else、for、while等) 函数的定义与调用 模块的导入…

    python 2023年5月14日
    00
  • Python中的程序流程控制语句

    下面是关于Python中的程序流程控制语句的详细攻略: 1. 程序流程控制语句概述 程序流程控制语句是一种用来控制程序执行流程的语句,包括条件语句和循环语句两种。 1.1 条件语句 条件语句根据不同的条件选择不同的行为进行执行,包括if语句和if-else语句。 if语句: if expression: statement(s) 当expression为真时…

    python 2023年5月30日
    00
  • 2019 Python最新面试题及答案16道题

    以下是针对“2019 Python最新面试题及答案16道题”的完整攻略: 1. 阅读下面程序,写出输出结果 a = [1, 2, 3, 4, 5] b = a a = a[:2] print(b) 答案: [1, 2, 3, 4, 5] 解析: 首先,列表a被赋值给了变量b,此时b和a引用了同一个列表对象。然后,使用切片操作(a = a[:2])将a截取了前…

    python 2023年5月13日
    00
  • python代码区分大小写吗

    Python代码区分大小写说明 在Python中,大小写是敏感的,这意味着在编写代码时,我们必须注意大小写的使用。下面有两个例子来说明这一点: 例子1: # 定义一个变量name和变量Name name = "Alice" Name = "Bob" # 输出变量name和变量Name print(name) print…

    python 2023年5月31日
    00
  • 如何将Python字符串转换为JSON的实现方法

    将Python字符串转换为JSON是一种常用的数据格式转换操作,本文将针对如何实现该操作进行详细讲解。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于理解和编写,常用于前后端接口传输数据。其具有以下几个特点: 轻量级:与XML相比更加简洁 易于理解:通俗易懂 易于解析:各种编程语言均有对应的解…

    python 2023年5月14日
    00
  • 如何在 Python 中编写内联注释

    【问题标题】:How to write an inline-comment in Python如何在 Python 中编写内联注释 【发布时间】:2023-04-02 01:25:01 【问题描述】: Python中有没有结束单行cmets的方法? 类似 /* This is my comment */ some more code here… 【问题讨…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部