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日

相关文章

  • 移动云计算应用开发入门经典

    《移动云计算应用开发入门经典》基本信息原书名:Beginning Mobile Application Development in the Cloud作者: (美)罗杰(Rodger, R.) [作译者介绍]译者: 王英群 赵松德丛书名: 移动与嵌入式开发技术出版社:清华大学出版社ISBN:9787302306580上架时间:2012-12-27出版日期:…

    云计算 2023年4月12日
    00
  • TKE 注册节点,IDC 轻量云原生上云的最佳路径

    林顺利,腾讯云原生产品经理,负责分布式云产品迭代和注册节点客户扩展,专注于云原生混合云新形态的推广实践。 背景 企业在持续业务运维过程中,感受到腾讯云 TKE 带来的便捷性和极致的使用体验,将新业务的发布以及老业务都迁移到云上 TKE 来实现。但很多企业数据中心建设较为早期,选型上采取了自建 IDC 机房的方案,长久以来的 IDC 运营维护和企业上云的诉求产…

    2023年4月10日
    00
  • 【云计算】开源装机自动化系统 CloudBoot OSInstall 介绍

    “CloudBoot”(OSinstall) 发布了。 产品更新及特点如下: 新增虚拟化操作系统适配:支持主流操作系统:RedHat、CentOS、SUSE、Ubuntu、Windows Server 2012、Windows Server2008、VMware Esxi、Openstack等 新增服务器硬件适配:支持主流服务器厂商的硬件, 华为、H3C、D…

    云计算 2023年4月13日
    00
  • Intel和NVIDIA加速卡买哪个好?Intel Xeon Phi与NVIDIA Tesla P100对比评测

    Intel和NVIDIA加速卡买哪个好? 本文将介绍Intel和NVIDIA加速卡买哪个好以及Intel Xeon Phi与NVIDIA Tesla P100对比评测的完整攻略,包括加速卡的选择、对比评测、示例说明等。 1. 加速卡的选择 在选择加速卡时,需要考虑以下几个方面: 应用场景:不同的应用场景需要不同的加速卡,例如深度学习、科学计算、图形渲染等; …

    云计算 2023年5月16日
    00
  • 云计算之路-阿里云上:2014年6月11日17点遇到的CPU 100%状况

    今天下午17:00-17:05之间,在请求量没有明显变化的情况下,SLB中的1台云服务器的CPU突然串到100%(当时SLB中一共有3台云服务器)。造成的直接后果是请求执行时间变得超长,最长竟然达到了53秒。另外伴随的表现是大量请求排队。从这些现象分析,我们猜测CPU 100%那台云服务器出现了CPU资源争抢问题。 今天下午17:00-17:05之间,在请求…

    云计算 2023年4月11日
    00
  • 最佳案例 | QQ 相册云原生容器化之路

    关于我们 更多关于云原生的案例和知识,可关注同名【腾讯云原生】公众号~ 福利: ①公众号后台回复【手册】,可获得《腾讯云原生路线图手册》&《腾讯云原生最佳实践》~ ②公众号后台回复【系列】,可获得《15个系列100+篇超实用云原生原创干货合集》,包含Kubernetes 降本增效、K8s 性能优化实践、最佳实践等系列。 ③公众号后台回复【白皮书】,可…

    2023年4月9日
    00
  • python中sys.argv参数用法实例分析

    Python中sys.argv参数用法实例分析 在Python中,可以使用sys.argv模块获取命令行参数。该模块用于从命令行读取参数,这些参数以列表的形式传递给Python脚本。下面是通过sys.argv模块获取命令行参数的基本用法。 命令行输入格式 命令行输入格式如下: python script.py arg1 arg2 arg3 … 其中,sc…

    云计算 2023年5月18日
    00
  • 阿里云栖大会展示中国计算力量 吸引全球2万开发者参与

    阿里云栖大会展示中国计算力量 吸引全球2万开发者参与 阿里云栖大会是阿里云每年举办的一次技术盛会,旨在展示中国计算力量和技术创新成果,吸引全球开发者参与。以下是阿里云栖大会展示中国计算力量的详细攻略,包括以下内容: 阿里云栖大会概述 展示中国计算力量的方式 示例说明 阿里云栖大会概述 阿里云栖大会是阿里云每年举办的一次技术盛会,旨在为全球开发者提供一个交流和…

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