python之TCP的网络应用程序开发

news2024/9/22 3:58:37

文章目录

  • 版权声明
  • python3编码转换
  • socket类的使用
    • 创建Socket对象
    • Socket对象常用方法和参数
    • 使用示例
      • 服务器端代码
      • 客户端代码
  • TCP客户端程序开发流程
  • TCP服务端程序开发流程
  • TCP网络应用程序注意点
  • socket之send和recv原理剖析
    • send原理剖析
    • recv原理剖析
    • send和recv原理剖析图
  • 多任务版TCP服务端程序开发

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

python3编码转换

  • 在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型
    在这里插入图片描述
函数名说明
encode编码 将字符串转化为字节码
decode解码 将字节码转化为字符串
  • encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。
    bytes.decode(encoding=“utf-8)
    str.encode(encoding=”utf-8)
    

socket类的使用

  • Python的 socket 类是Python标准库的一部分,用于提供对低级网络接口的访问。支持IPv4、IPv6、TCP、UDP等协议,允许创建基于网络的应用程序,如服务器和客户端。

创建Socket对象

  • 要使用 socket 类,首先需要导入 socket 模块,然后创建一个 socket 对象。可以通过调用 socket.socket() 方法并传递相应的参数来创建一个socket。
    import socket
    # 创建一个socket对象,默认是IPv4和TCP协议
    # socket.socket(AddressFamily, Type)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

Socket对象常用方法和参数

方法/参数类型/描述示例/默认值说明
socket()构造函数用于创建socket对象
family参数socket.AF_INET地址族,确定了socket的类型(IPv4或IPv6)
type参数socket.SOCK_STREAM指定了socket的通信类型(TCP或UDP)
proto参数0协议编号,默认为0,由系统选择合适的协议
fileno参数None可以指定一个文件描述符
bind(address)方法绑定地址到socket
address参数('localhost', 12345)一个包含主机名和端口号的元组
listen(backlog)方法开始监听传入连接
backlog参数5定义了等待队列的大小
accept()方法接受一个连接,返回(conn, address)
connect(address)方法用于客户端连接服务器
send(bytes)方法发送数据,参数为字节数据
recv(bufsize)方法接收数据,指定最大数据量
bufsize参数1024接收数据的缓冲区大小
close()方法关闭socket连接

使用示例

服务器端代码

import socket

# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址(host,port)
server_socket.bind(('localhost', 12345))

# 开始监听
server_socket.listen()

print("服务器启动,等待连接...")

# 接受连接
connection, address = server_socket.accept()
print(f"连接来自 {address}")

# 接收数据
data = connection.recv(1024)
print(f"接收到的数据: {data.decode()}")

# 发送数据
connection.send("Hello, client!".encode())

# 关闭连接
connection.close()

客户端代码

import socket

# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器
client_socket.connect(('localhost', 12345))

# 发送数据
client_socket.send("Hello, server!".encode())

# 接收数据
data = client_socket.recv(1024)
print(f"接收到的数据: {data.decode()}")

# 关闭连接
client_socket.close()

这仅仅是一个非常简单的例子,实际应用中还需要处理错误、多线程或多进程处理多个连接、非阻塞IO等复杂情况。

TCP客户端程序开发流程

  • TCP网络应用程序开发分为:

    • TCP客户端程序开发,运行在服务器设备上的程序,专门为客户端提供数据服务。
    • TCP服务端程序开发,运行在用户设备上的程序
  • TCP客户端程序开发流程

    1. 创建客户端套接字对象(买电话)
    2. 和服务端套接字建立连接(打电话)
    3. 发送数据(说话)
    4. 接收数据(接听)
    5. 关闭客户端套接字(挂电话)
      在这里插入图片描述
  • TCP客户端开发程序流程

    1. 创建客户端套接字对象
    2. 和服务端套接字建立连接
    3. 发送数据
    4. 接收数据
    5. 关闭客户端套接字
import socket

if __name__ == '__main__':
    # 1.创建客户端套接字对象
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.和服务端套接字建立连接
    tcp_client_socket.connect(("localhost", 8080))
    # 3.发送数据
    tcp_client_socket.send("hello".encode(encoding="utf-8"))
    # 4.接收数据 recv阻塞等待数据的到来
    recv_data = tcp_client_socket.recv(1024)
    print(recv_data.decode())
    # 5.关闭客户端套接字
    tcp_client_socket.close()

TCP服务端程序开发流程

在这里插入图片描述

  1. 创建服务端端套接字对象
  2. 绑定IP地址和端口号
  3. 设置监听
  4. 等待接受客户端的连接请求
  5. 接收数据
  6. 发送数据
  7. 关闭套接字
import socket

if __name__ == '__main__':
    # 1.创建服务端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 绑定IP地址和端口号
    # bind中的参数第一个ip地址元素设置为"",默认为本机ip地址
    tcp_server_socket.bind(("", 8080))
    # 3.设置监听 128:代表服务端等待排队连接的最大数量
    tcp_server_socket.listen(128)
    # 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址
    conn_socket, ip_port = tcp_server_socket.accept()
    print("客户端地址:", ip_port)
    # 5.接收数据
    recv_data = conn_socket.recv(1024)
    print("接收到的数据:", recv_data.decode())
    # 6.发送数据
    conn_socket.send("客户端你的数据我收到了".encode())
    # 7.关闭套接字
    conn_socket.close()
    tcp_server_socket.close()

TCP网络应用程序注意点

  1. 当TCP客户端程序想要和TCP服务端程序进行通信的时候必须要先建立连接
  2. TCP客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的
  3. TCP服务端程序必须绑定端口号,否则客户端找不到这个TCP服务端程序。
  4. listen后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息
  5. 当TCP客户端程序和TCP服务端程序连接成功后,TCP服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字.
  6. 关闭accept返回的套接字意味着和客户端已经通信完毕当客户端的套接字调用close后,服务器端的recv会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的recv也会解阻塞,返回的数据长度也为0。

socket之send和recv原理剖析

  • 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存中的一片空间。

send原理剖析

  • send发送数据给服务端:必须得通过网卡发送数据,应用程序是无法直接通过网卡发送数据的,它需要调用操作系统接口,也就是说,应用程序把发送的数据先写入到发送缓冲区(内存中的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡。

recv原理剖析

  • recv从客户端接收数据:应用软件是无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统通过网卡接收数据,把接收的数据写入到接收缓冲区(内存中的一片空间),应用程序再从接收缓存区获取客户端发送的数据。

send和recv原理剖析图

在这里插入图片描述

  • 不管是recv还是send都不是直接接收到对方的数据和发送数据到对方,发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取,发送数据和接收数据最终是由操作系统控制网卡来完成。

多任务版TCP服务端程序开发

  • 实现步骤分析:
    在这里插入图片描述
  1. 编写一个TCP服务端程序,循环等待接受客户端的连接请求

    while True:
      service_client_socket, ip_port = tcp_server_socket.accept()
    
  2. 当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞

while True:
  service_client_socket, ip_port = tcp_server_socket.accept()
  sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))
  sub_thread.start()
  • 完整代码:
import socket
import threading


# 处理客户端函数
def handle_client(conn_socket):
    # 5.接收数据
    recv_data = conn_socket.recv(1024)
    print("接收到的数据:", recv_data.decode())
    # 6.发送数据
    conn_socket.send("收到客户端数据:".encode())
    # 7.关闭套接字
    conn_socket.close()


# 1 使用循环接收客户端的连接请求
if __name__ == '__main__':
    # 1.创建服务端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用,让程序退出端口号立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 2. 绑定IP地址和端口号
    # 如果bind中的参数第一个ip地址元素设置为"",默认为本机ip地址
    tcp_server_socket.bind(("", 8888))
    # 3.设置监听 128:代表服务端等待排队连接的最大数量
    tcp_server_socket.listen(128)

    while True:
        # 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址
        conn_socket, ip_port = tcp_server_socket.accept()
        print("客户端地址:", ip_port)

        # 使用多线程去接收多个客户端的请求 设置守护主线程
        sub_thread = threading.Thread(target=handle_client, args=(conn_socket,), daemon=True)

        sub_thread.start()

    tcp_server_socket.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1245104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【管理运筹学】背诵手册(五)| 动态规划

五、动态规划 基本概念 阶段(Stage):将所给问题的过程,按时间或空间特征分解成若干相互联系的阶段,以便按次序去求解每阶段的解,常用字母 k k k 表示。 状态(State):…

iOS APP包分析工具 | 京东云技术团队

介绍 分享一款用于分析iOSipa包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看。这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加效率的优化包体积问题。 工具下载…

HTB Codify WriteUp

Codify 2023年11月7日 20:59:48user nmap ➜ Codify nmap -A 10.10.11.239 Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-07 21:00 CST Nmap scan report for bogon (10.10.11.239) Host is up (0.14s latency). Not shown: 997 closed ports PORT STATE SERVI…

An issue was found when checking AAR metadata

一、报错信息 An issue was found when checking AAR metadata:1. Dependency androidx.activity:activity:1.8.0 requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.:app is currently compiled against …

spark的算子

spark的算子 1.spark的单Value算子 Spark中的单Value算子是指对一个RDD中的每个元素进行操作,并返回一个新的RDD。下面详细介绍一些常用的单Value算子及其功能: map:逐条映射,将RDD中的每个元素通过指定的函数转换成另一个值&am…

009 OpenCV 二值化 threshold

一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数…

app小程序定制的重点|软件定制开发|网站搭建

app小程序定制的重点|软件定制开发|网站搭建 App小程序定制开发是近年来快速发展的一项技术服务,随着移动互联网的普及和用户需求的不断升级,越来越多的企业和个人开始关注和需求定制化的小程序开发。那么,对于app小程序定制开发来说&#xf…

第十五届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组(详细分析解答)

目录 1.动态的Tab栏 1.1 题目要求 1.2 题目分析 1.3 源代码 2.地球环游 2.1 题目要求 2.2 题目分析 2.3 源代码 3.迷惑的this 3.1 题目要求 3.2 题目分析 3.3 源代码 4.魔法失灵了 4.1 题目要求 4.2 题目分析 4.3 源代码 5.燃烧你的卡路里 5.1 题目要求 5.2…

U-boot(四):start_armboot

本文主要探讨210的uboot启动的第二阶段,主要函数为start_armboot。 uboot 一阶段初始化SoC内部部件(看门狗、时钟等),初始化DDR,重定位 二阶段初始化其余硬件(iNand、网卡芯片)以及命令、环境变量等 启动打印硬件信息,进入bootdelay,读秒完后执行bootc…

(2023码蹄杯)省赛(初赛)第二场真题(原题)(题解+AC代码)

题目1&#xff1a;MC0214捡麦子 码题集OJ-捡麦子 (matiji.net) 思路: 1.第n米在前n-1米的基础上多加一个n个麦子&#xff0c;那么直接从1开始枚举&#xff0c;累加答案即可 AC_Code:C #include<bits/stdc.h> using namespace std;int main( ) {int n; cin>>n;…

ES6 — ES14 新特性

一、ES6 新特性&#xff08;2015&#xff09; 1. let和const 在ES6中&#xff0c;新增了let和const关键字&#xff0c;其中 let 主要用来声明变量&#xff0c;而 const 通常用来声明常量。let、const相对于var关键字有以下特点&#xff1a; 特性varletconst变量提升✔️全局…

NX二次开发UF_CAM_update_list_object_customization 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_update_list_object_customization Defined in: uf_cam.h int UF_CAM_update_list_object_customization(tag_t * object_tags ) overview 概述 This function provids the…

Elasticsearch:ES|QL 函数及操作符

如果你对 ES|QL 还不是很熟悉的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;ES|QL 查询语言简介​​​​​​​”。ES|QL 提供了一整套用于处理数据的函数和运算符。 功能分为以下几类&#xff1a; 目录 ES|QL 聚合函数 AVG COUNT COUNT_DISTINCT 计数为近…

web:[WUSTCTF2020]朴实无华

题目 点开页面显示如下 页面显示了一行报错&#xff1a;Cannot modify header information - headers already sent by (output started at /var/www/html/index.php:3) in /var/www/html/index.php on line 4 意思为不能修改报头信息-报头已经发送(输出开始于/var/www/html/i…

Ubuntu20.04 install pnpm

npm install -g pnpm referrence link: Installation | pnpmPrerequisiteshttps://pnpm.io/installation

嵌入式系统在工业自动化中的应用

嵌入式系统在工业自动化中的应用非常广泛&#xff0c;它们通过集成控制和实时响应能力&#xff0c;实现了生产线的自动化、智能化和高效化。以下将详细介绍嵌入式系统在工业自动化中的几个重要应用领域&#xff0c;并提供一些示例代码。 1. PLC&#xff08;可编程逻辑控制器&a…

Maven 简单配置阿里云镜像

配置步骤&#xff1a; 1、找到 maven 的安装目录&#xff0c;修改settings.xml 2、在文件中找到<mirrors>标签&#xff0c;然后再标签中添加阿里云配置即可 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共…

FFmpeg常用命令讲解及实战二

文章目录 前言一、ffmpeg 常用命令1、ffmpeg 的封装转换2、ffmpeg 的编转码3、ffmpeg 的基本编转码原理 二、ffprobe 常用参数1、show_format2、show_frames3、show_streams4、print_format5、select_streams 三、ffplay 的常用命令1、ffplay 常用参数2、ffplay 高级参数3、ffp…

ARCore:在Android上构建令人惊叹的增强现实体验

ARCore&#xff1a;在Android上构建令人惊叹的增强现实体验 一、 AR 介绍1.1 AR技术简介1.2 AR技术原理1.3 AR技术应用领域 二、Google的增强现实平台ARCore2.1 ARCore简介2.2 ARCore API介绍2.3 ARCore API使用示例 三、总结 一、 AR 介绍 增强现实 Augmented Reality&#x…

python中一个文件(A.py)怎么调用另一个文件(B.py)中定义的类AA详解和示例

本文主要讲解python文件中怎么调用另外一个py文件中定义的类&#xff0c;将通过代码和示例解读&#xff0c;帮助大家理解和使用。 目录 代码B.pyA.py 调用过程 代码 B.py 如在文件B.py,定义了类别Bottleneck&#xff0c;其包含卷积层、正则化和激活函数层&#xff0c;主要对…