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日

相关文章

  • 《云计算》在lunix系统中搭建FTP服务以及简单应用

    FTP工作原理 FTP服务概述FTP,File Transfer Protocol基于C/S结构的文件传输协议FTP会话属于复合TCP连接控制连接:TCP 21 端口,发送FTP命令信息数据连接:TCP 20 端口,上传/下载数据 连接模式、传输模式数据连接模式主动模式:服务端20端口 客户端被动模式:服务端 ?? 端口 客户端?? 端口范围需预先限定传输模…

    云计算 2023年4月13日
    00
  • 阿里云函数计算尝试

    最近沉浸工作,好久没有写博客了。 写一篇关于阿里云函数计算相关尝试的笔记,也从这里入手,尝试一下Serverless开发。 前面 总的来说,省去了运维部分,直接使用计算资源,只需要写代码即可。同时与普通方式对比来看,也配备了日志记录,资源监控,报警,版本管理等,大致需求可以满足,无二差别。 上手 VS Code 插件安装:Aliyun Serverless,…

    云计算 2023年4月12日
    00
  • 2019年Linux运维趋势与规划展望

    2019年Linux运维趋势与规划展望 Linux运维是当前IT行业中非常重要的一个领域,随着技术的不断发展,Linux运维也在不断变化和发展。本文将介绍2019年Linux运维趋势与规划展望的完整攻略,包括背景介绍、趋势分析、规划展望、示例说明等。 1. 背景介绍 Linux运维是指对Linux系统进行管理、维护和优化的工作。随着云计算、大数据、人工智能等…

    云计算 2023年5月16日
    00
  • C# 利用Autofac批量接口注入依赖的问题小结

    我来详细讲解一下“C#利用Autofac批量接口注入依赖的问题小结”的完整攻略。 什么是Autofac? Autofac是一个开源的依赖注入(DI)框架,它能够管理对象的创建和生命周期。Autofac通过允许程序开发人员构建应用程序和组件的可扩展体系结构来增强.NET应用程序的模块化。 Autofac的批量注入 对于需要注入的接口特别多的情况,可以使用Aut…

    云计算 2023年5月17日
    00
  • 当生命科学遇到云计算——IBM Bluemix医疗行业应用沙龙精彩回顾

    3月17日,“当生命科学遇到云计算——IBM Bluemix医疗行业应用”沙龙在上海建国宾馆成功举办。本次活动由IBM Bluemix主办、CSDN联合主办,汇集全球医疗、制药、基因、生命云、健康、生命科学、医院等领域的技术专家、学者、产业精英、投融资机构杰出代表,聚焦云计算在生命科学中的实践和应用创新,为与会各方奉上了精彩绝伦的技术盛宴。 物联网、移动互联…

    云计算 2023年4月13日
    00
  • 云计算 学习笔记(1) Hadoop简介 – 完美de幸福

    云计算 学习笔记(1) Hadoop简介 Hadoop 简介 Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,由于分布式存储对于分布式编程来说是必不可少的,这个框架中还包含了一个分布式文件系统 HDFS( Hadoop Distributed File System )。也许到目前为止,Hadoop 还不是那么广为人知,其最新的版本号也仅…

    云计算 2023年4月13日
    00
  • 年中盘点 | 2022年,PaaS 再升级

    PaaS从哪里来,到哪里去?在数字化时代,PaaS的重心会发生什么样的转移?     作者丨刘世民(Sammy Liu)全文共7741个字,预计阅读需要15分钟    过去十五年,是云计算从无到有突飞猛进的十五年。PaaS作为云计算的重要组成部分,在伴随着云计算高速发展的同时,在云计算产业链中的关键性作用日渐凸显。关于PaaS,很多人都认同一个观点,在公有云…

    2023年4月10日
    00
  • iCloud爆发了“艳照门” 如何防止iCloud被窃取隐私?

    iCloud被窃取隐私防范攻略 背景 最近在社交媒体上看到iCloud被窃取隐私的新闻,许多用户的“私密”照片被泄露出来,引发了一些用户的担忧。在这里,我将为大家介绍一些防止iCloud被窃取隐私的有效方法。 方法 1. 启用两步验证 苹果提供了两步验证的安全机制,可以在登录或进行某些敏感操作时提供额外的验证方式。此外,苹果还可以实现短信验证码的验证方式,用…

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