python socket多线程通讯实例分析(聊天室)

让我们来详细讲解“python socket多线程通讯实例分析(聊天室)”的完整攻略。

一、背景介绍

在网络编程中,socket是一个非常重要的模块,可以通过socket实现不同设备之间的通信,如:客户端和服务器之间的通信。本文将通过Python socket实现多线程通讯,构建类似聊天室的功能。同时,本文还会对socket相关的概念进行一定的介绍,方便理解。

二、Python socket相关概念介绍

1. IP地址

IP(Internet Protocol)地址是指互联网协议地址,用于标识网络上的主机或路由器。在IPv4中,IP地址是由四个数字(0-255)组成,中间用点号(.)隔开,例如192.168.0.1。

2. 端口号

在计算机网络中,端口号是用来区分不同进程或应用程序的标识符。端口号是一个16位的数字,取值范围是0~65535。其中,0~1023为系统保留端口号,一般不被用户进程使用。

3. socket

socket是指通信中的两个端点,每个socket都有一个IP地址和一个端口号。Socket是支持TCP/IP协议的通信传输模型,是计算机网络中的一个抽象概念。可以用于在不同的终端之间传递数据。

4. TCP和UDP协议

TCP/IP协议是互联网的传输协议之一,主要有两个子协议:TCP和UDP。TCP协议提供面向连接的、可靠的数据传输,而UDP协议则提供无连接的、不可靠的数据传输。

三、Python socket多线程通讯实例

在使用Python socket进行多线程通讯时,我们需要使用线程池和套接字。

1. 创建线程池

线程池是指在程序启动时创建一定数量的线程,并将它们存储在池中,程序需要时,就可以直接从池中获取线程,而不用等待线程创建。这样就能减少线程的创建和销毁,提高程序的执行效率。

在Python中,我们可以通过threading模块来实现线程池的创建。具体方式如下:

import threading

pool = threading.Threadpool(num_threads)    # 创建线程池

其中,num_threads为线程池中线程的数量,可以自定义。

2. 创建套接字

在Python中,我们需要使用socket模块来创建套接字,在套接字上设置IP地址和端口号。

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 创建套接字
server.bind(('IP地址', 端口号))    # 设置IP地址和端口号

其中,AF_INET表示IP地址族,SOCK_STREAM表示传输层协议(TCP)。

3. 监听套接字

在创建好套接字后,我们需要与客户端建立连接。这时,我们就需要使用listen()方法来监听套接字。

server.listen(5)    # 监听套接字,最多添加5个客户端

4. 处理客户端连接请求

客户端连接成功后,我们需要向客户端发送欢迎信息。这里我们使用send()方法实现。

client.send('欢迎进入聊天室!'.encode('utf-8'))    # 向客户端发送欢迎信息

此外,我们还需要使用recv()方法接收客户端发送过来的信息。

client.recv(1024).decode('utf-8')    # 接收客户端发送过来的信息

5. 发送消息

在聊天室中,我们需要不断地向其他客户端发送消息。这里,我们可以在send()方法中通过遍历所有客户端,来实现对多个客户端的信息广播。

for client in client_list:
    client.send(message.encode('utf-8'))    # 发送信息给所有客户端

6. 关闭套接字

在聊天室关闭时,我们需要关闭所有的套接字,以防止资源浪费。这里,我们可以使用shutdown()方法,将套接字设置为不可用,并将输入和输出流均关闭。

server.shutdown(socket.SHUT_RDWR)    # 关闭输入和输出流
server.close()    # 关闭套接字

四、示例说明

示例1. 利用Python socket实现简易聊天室

import socket
import threading

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 创建套接字
server.bind(('0.0.0.0', 8000))    # 设置IP地址和端口号
server.listen(5)    # 监听套接字,最多添加5个客户端

client_list = []    # 定义空列表存储客户端

def handle_client(client, addr):
    client_list.append(client)    # 添加客户端到列表中
    while True:
        try:
            message = client.recv(1024).decode('utf-8')    # 接收客户端发送的信息
            if message:
                print('来自(%s)的消息:%s' % (addr, message))    # 打印信息
                for c in client_list:
                    c.send(message.encode('utf-8'))    # 向其他客户端发送信息
            else:
                client_list.remove(client)    # 从列表中移除客户端
                client.close()    # 关闭客户端套接字
                break
        except:
            client_list.remove(client)    # 从列表中移除客户端
            client.close()    # 关闭客户端套接字
            break

while True:
    client, addr = server.accept()    # 等待客户端连接
    print('新客户端连接:', addr)
    thread = threading.Thread(target=handle_client, args=(client, addr))
    thread.start()    # 启动新线程

示例2. 利用Python socket实现简易文件传输

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 创建套接字
server.bind(('0.0.0.0', 8000))    # 设置IP地址和端口号
server.listen(5)    # 监听套接字,最多添加5个客户端

while True:
    client, addr = server.accept()    # 等待客户端连接
    print('新客户端连接:', addr)
    file_name = client.recv(1024).decode('utf-8')    # 接收文件名
    with open(file_name, 'rb') as f:
        data = f.read()    # 读文件内容
        client.sendall(data)    # 发送文件内容

server.close()

五、总结

本文详细介绍了Python socket模块并利用socket实现了聊天室和文件传输功能。同时,还介绍了线程池等相关知识,希望对大家能够有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python socket多线程通讯实例分析(聊天室) - Python技术站

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

相关文章

  • ASP.NET MVC的Localization本地化多语言支持

    ASP.NET MVC是一个非常流行的Web开发框架,它为应用程序的开发提供了很好的支持。Localization(本地化)是一个极其重要的功能,可以让应用程序在不同的语言环境下运行。本文将详细讲解如何在ASP.NET MVC框架中实现Localization多语言支持。 创建多语言资源文件 Localization的第一步是创建多语言资源文件(Resour…

    云计算 2023年5月17日
    00
  • Server SAN:弄潮儿云计算时代

    最初发表于《程序猿》2014年7每月一次。 4月30日本。Redhat公布1.71十亿收购Ceph开发商Inktank公司,加上之前2011年10月1.36十亿收购Gluster,Redhat纳入旗下。 5月17日。最后一台小型机在阿里巴巴支付宝下线,标志着阿里已经完毕“去IOE化”。 随后国内互联网以及有技术实力的公司,掀起了一场去IOE(以IBM, Or…

    云计算 2023年4月9日
    00
  • 云计算平台(检索篇)-Elasticsearch-检索篇

             ES检索篇主要是对索引中的数据进行查询的一个过程: 1.IndexReader打开索引文件,读取并打开指向索引文件的流。 2.用户输入查询语句 3.将查询语句转换为查询对象Query对象树 4.构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分)。 5.构造Scor…

    云计算 2023年4月10日
    00
  • [云计算小课] 【第二课】云小课带你了解镜像家族!

    本次课程希望能够帮助您深入理解华为云镜像服务,包括私有镜像与公共镜像之间的区别,探讨当前华为云镜像服务的各种功能。   简单的说,镜像就好像是克隆体,它可以把一个已有的云主机操作系统和应用服务,快速的复制到您的云主机中,省时又省力。     温馨小提示: 还没有华为云账户来体验本节课程的操作吗? 戳这里,免费注册华为云账户! 有账户没有云服务器? 戳这里,免…

    云计算 2023年4月12日
    00
  • 徐少春说,金蝶国际明年就成真正意义上的云计算公司

        金蝶国际徐少春对外发言指出,2020年成为一家真正意义上的云计算公司。   你们信吗?   对于一个以财务软件起家的软件公司,如何转型到云计算领域的弄潮儿,其实这个事情的发展并不是金蝶所情愿的。毕竟用户依托云平台来实现财务、进销存、ERP等管理,这个需求和趋势的强烈,必然导致金蝶软件这样的公司不断转型。   实际上,从金蝶软件发展的这些年来看,云业务…

    云计算 2023年4月13日
    00
  • 企业构建云计算,主要划分为哪几步?

    步骤1-根据业务目标设置云计算目标 构建专为企业设计的私有云必须从业务讨论开始。如果企业的基础结构团队正在启动一个没有开发人员的云项目,请中止它们。这需要与开发人员和用户沟通,更重要的是面向产品,营销和销售经理的对外团队。让所有利益相关者参与讨论云计算如何加速业务流程或转变业务提供方式。并在业务方面制定明确的目标和成功标准。 步骤2-采用企业基础设施的投资组…

    云计算 2023年4月12日
    00
  • Hadoop介绍与安装配置方法

    Hadoop介绍与安装配置方法 Hadoop是一种分布式计算框架,可以处理大规模数据集。本文将介绍Hadoop的基本概念、安装配置方法和示例说明。 1. Hadoop的基本概念 Hadoop由两个核心组件组成:Hadoop分布式文件系统(HDFS)和MapReduce计算模型。HDFS是一种分布式文件系统,可以将大规模数据集存储在多个节点上。MapReduc…

    云计算 2023年5月16日
    00
  • 云计算第二阶段shell脚本

    pstree                         #查看进程树 cat /etc/shells                #查看系统安装的所有shell解释器 yum -y install ksh                      #安装新的解释器   1、声明解释器                 #!/bin/bash 2、注释脚…

    云计算 2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部