当前位置: 首页 > news >正文

小杰python(six day)——网络编程

1.网络协议模型

网络协议模型主要分成两类:

        1.OSI模型:

OSI协议模型由ISO(国际标准化组织)提出的,是一种理想化模型,主要包含7层结构

        2.TCP/IP协议族:

TCP/IP是互联网上的工业标准,也是我们目前互联网的基础,它确保了不同类型的计算机和网络能够相互通信

自下而上介绍一下每一层的作用

网络接口和物理层:屏蔽硬件差异,向上层提供统一的操作接口。

网络层:提供端对端的传输,可以理解为通过IP寻址机器。

传输层:决定数据交给机器的哪个任务去处理

应用层:应用协议和应用程序的集合

2. IP地址

        IP地址(Internet Protocol Address),即互联网协议地址,是分配给每一台联网计算机或设备的唯一标识符。通俗的讲,IP地址就是每台联网设备的身份证,它使得网络中的设备能够相互识别并进行通信。目前IP地址有两种:IPv4和IPv6

  • IPV4地址

        IPv4地址由32位二进制数组成,为了方便记忆,通常以**点分十进制**表示,即将32位二进制数分成4组,每组8位,中间用小数点分隔,例如:192.168.1.1。IPv4地址由两部分组成:**网络号**和**主机号**,但是随着网络的不断发展,网络设备的增多,IPv4地址空间有限,现在已经接近枯竭

  • IPV6地址

        用于解决IPv4地址枯竭的问题。IPv6使用128位地址,这极大地扩展了地址空间。IPv6地址通常表示为八组四位十六进制数,每组之间用冒号隔开,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。

(1)IPV4地址分类

3. 端口号

        是计算机网络中用于标识特定网络服务或应用程序实例的数字,是一个16位的二进制数,其取值范围是0-65535。

        http:应用层协议BS架构下浏览器服务器之间通信808080

        mqtt:物联网协议1883

在同一台计算机上,通过端口号可以区分不同的应用程序或服务。

公认端口端口号0-1023,这些端口被永久性地分配给特定的服务或应用程序。例如,HTTP服务通常使用80端口,HTTPS使用443端口。

注册端口:端口号1024-49151,这些端口可以被注册给特定的应用程序或服务,但不像公认端口那样固定不变。

动态或私有端口:端口号49152-65535,这些端口一般用于临时的客户端应用程序,也可以被服务器用于某些特定的服务。

4.  TCP 和 UDP

相同点:

两个协议是都是传输层协议

不同点:

        TCP是传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议;通过序列号、确认机制、校验和、流量控制、拥塞控制灯方式保证了它的高可靠性;主要应用在文件传输、电子邮件、web浏览器等领域。(流式套接字)

        UDP是用户数据报协议(UDP,User Datagram Protocol)是一种无连接的、不可靠的、基于数据报的传输层通信协议;它具有传输速度快、比较轻量的特点;主要应用在实时多媒体传输、广播组播通信、简单的网络应用、快速数据传输等领域。(数据报套接字)

5.  TCP  编程

C/S架构client/server

B/S架构browser/server

(1)编程步骤

服务端客户端

(2) socket 模块

        socket(套接字)是网络通信中的一个抽象概念,它是计算机之间进行通信的端点。在 Python 中,使用`socket`模块可以创建不同类型的套接字,实现客户端与服务器之间的通信

import socket

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

功能:创建套接字

参数:family:指定地址族

                socket.AF_INET:这是最常见的地址族,表示IPV4地址。使用这个地址族创建的套接字可以在互联网上与其他IPV4主机进行通信。

                socket.AF_INET6:表示IPV6地址。

        type:套接字类型

                socket.SOCK_STREAM:面向连接的流式套接字,如TCP

                socket.SOCK_DGRAM:无连接的数据报套接字,如UDP

        proto:协议编号,通常为0,表示自动选择合适的协议。

        fileno:如果指定了文件描述符,则使用该文件描述符创建套接字,而不是创建新的套接字,通常不指定。\

返回值:套接字对象

(3)常用方法

bind(address)

功能:将套接字绑定到指定的地址和端口

参数:address:是一个元组,包含ip地址和端口号

如:('127.0.0.1', 8888)

listen(backlog)

功能:开始监听连接请求

参数:backlog:可以挂起的最大连接数量

sockfd, addr = accept()

功能:等待客户端的连接,这个方法会一直阻塞到有客户端连接

返回值:返回一个新的套接字对象和客户端的地址,新的套接字对象可以用于与客户端进行通信,而客户端的地址通常是一个元组,包含客户端的 IP 地址和端口号。

connect(address)

功能:连接到指定的地址。`address`是服务器的地址和端口号组成的元组。

send(data)

功能:发送数据

参数:data:要发送的字节数据,如果发送字符串需要先进行encode编码

返回值:实际发送的字节数

buf = recv(bufsize)

功能:接收数据

参数:bufsize:指定一次最多接收的字节数

返回值:接收到的字节数据。接收到的是字节串,需要使用decode进行解码。

注意:如果没有数据可接收,这个方法会阻塞,直到有数据到来或者连接关闭。如果连接关闭,返回一个空字节串

close()

功能:关闭套接字

ipcomfig

查询计算机ip地址

(4)示例代码

服务器代码
import socket as st# 创建套接字(用于连接的套接字)
sfd = st.socket(st.AF_INET, st.SOCK_STREAM)# 绑定(ip和端口号与socket进行绑定)
sfd.bind(('192.168.50.19', 8888))# 监听(5:最大监听个数)
sfd.listen(5)# 等待客户端的连接(用于通信的套接字,对方的地址信息)
confd, addr = sfd.accept()
print('连接成功')# 接收数据
buf = confd.recv(32)
# 对接收到的字节流进行解码为字符串
print(buf.decode())
客户端代码
import socket as st# 创建套接字
sfd = st.socket(st.AF_INET, st.SOCK_STREAM)# 连接服务器
sfd.connect(("192.168.50.19", 8888))# 将字符串编码成字节流后发送出去
buf = 'hello'
# sfd.send(b'hello')
sfd.send(buf.encode())

(5)字符的编码和解码

编码   encode()
解码   decode()

        在处理文件、网络通信或处理二进制数据时,会涉及到字符串和字节流的转换,这时就用到字符的编码和解码过程。

编码将字符串转换为字节流的过程,使用字符串的 encode() 方法

解码将字节流转换为字符串,使用字节流的 decode() 方法

6.   UDP 编程

(1)编程步骤

sendto(data, address)

sendto(data, address)

功能:发送数据

参数:data:要发送的数据

        address:一个二元组,包含目标地址和端口号

        buf, addr = recvfrom(bufsize, flags)

功能:接收数据

参数:bufsize:要接受的最大字节数

           flags:一个可选参数,和系统有关,使用默认值即可

返回值:是一个元组,包含接收到的字节数据、对方地址和端口号。

http://www.dtcms.com/a/330609.html

相关文章:

  • 前端Vite介绍(现代化前端构建工具,由尤雨溪开发,旨在显著提升开发体验和构建效率)ES模块(ESM)、与传统Webpack对比、Rollup打包
  • 20250814 最小生成树总结
  • Vue 3 + TypeScript:package.json 示例 / 详细注释说明
  • Linux 上手 UDP Socket 程序编写(含完整具体demo)
  • 如何通过WiFi将文件从安卓设备传输到电脑
  • 计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()
  • 机器学习 - Kaggle项目实践(3)Digit Recognizer 手写数字识别
  • 分布式事务、锁、链路追踪
  • 读取数据excel
  • 高效TypeScript开发:VSCode终极配置指南
  • 待办事项小程序开发
  • (第十六期)HTML布局标签详解:div与span的深度解析
  • 【读代码】深度解析 context-engineering-intro:开源上下文工程实践原理与应用
  • 群晖 NAS 影音访问:通过 cpolar 内网穿透服务实现 Nastool 远程管理
  • java集合 之 多列集合
  • Python/Node.js 调用taobao API:构建实时商品详情数据采集服务
  • 使用HalconDotNet实现异步多相机采集与实时处理
  • Mybatis学习笔记(六)
  • 桥接模式C++
  • 成都国际影像产业园:接重庆五一职院实训就业考察
  • [系统架构设计师]软件工程基础知识(五)
  • 系统思考:转型困扰与突破
  • 【软考中级网络工程师】知识点之入侵检测深度剖析
  • 开源安全云盘存储:Hoodik 实现端到端数据加密,Docker快速搭建
  • 分享一个基于Hadoop+spark的超市销售数据分析与可视化系统,超市顾客消费行为分析系统的设计与实现
  • Java应用架构实战指南:主流模式解析与Spring落地实践
  • 从零开始学Python之数据结构(字符串以及数字)
  • Java 大视界 -- Java 大数据机器学习模型在金融欺诈检测与防范策略制定中的应用(397)
  • 工业一体机5G通讯IC/ID刷卡让MES系统管理更智能
  • 第四天~在CANFD或CAN2.0的ARXML文件中实现Multiplexor多路复用信号实战