python网络编程基础

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 目录1、udp2、tcp3、socket函数4、粘包问题标签(空格分隔): 网络编程目录tcp和udp1、udptcp、udp是第四层传输层拥有的协议,用于在完成寻址功能后的数据传输。

目录

标签(空格分隔): 网络编程


目录

tcp和udp

1、udp

tcp、udp是第四层传输层拥有的协议,用于在完成寻址功能后的数据传输。传输层将路由交换层和应用数据层划分开,主要提供数据传输控制。
udp的使用是面向无连接的,即协议自身的设计是不保证数据的有序性和重传的,这样的缺点是丢包率增加,并且无法有序的接收数据。不过这两个缺点都可以通过应用层来弥补。而udp的优点是报头小、数据传输效率高(不需要确认、协商各种流控制等等),所以udp更适用于数据需要快速传输,并对数据完整性并不太高的场景。比如:视频直播,要求实时传输,而且可以接受部分的丢帧。
udp报头非常的简单,核心只有端口+校验和

2、tcp

tcp的使用是面向连接的,即数据的传输必须基于虚链路的完整建立。虚链路的建立提供了很多优秀的功能,比如确认重传以保证数据的完整性,滑动窗口以保证数据传输的高效性,各类选项字段提供不同的可选功能。tcp的缺点是报头大,因为需要包含比udp更多的功能字段,而且tcp数据的每次发送都必须得到确认否则将会重传。tcp一般应用于对数据完整性要求很高的场景。比如:ssh。
tcp的报头字段比较多,核心有:seq和ack用于处理确认重传、SYN/FIN/RST等用于提供数据包身份标记、窗口用于处理流量控制、还有各种选项。

3、socket函数

为了将路由交换和应用层分离开,socket提供了一个统一的接口供应用层直接调用而无需考虑底层路由交换的通信问题。
所有的操作系统都提供socket调用,python的socket模块也是对底层socket模块的封装,并提供了方便使用的一些函数接口。

1、建立对象

# 实例化一个socket对象,用于处理本地的socket事务,不论是服务器还是客户端都一样
# socket模块提供了很多不同类型的socket,这里选择tcp,使用ipv4

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、bind

# socket对象可以绑定本地的ip和端口号,这个函数在服务器和客户端均可使用,不过一般不会绑定客户端
# 客户端的ip和端口一般使用随机。
# 服务器一般会固定ip和端口以供大量客户端连接
# 服务器提供的ip会通过dns发布域名
# bind的参数是一个ip+port的元组,如果没有提供ip,则会监听本机所有对外接口ip

sock.bind(('127.0.0.1', 8080))

3、listen

# 此函数只应该用于服务器,因为服务器才需要监听端口等待客户主动连接
# 此函数将会告知操作系统监听socket连接
# 此函数的底层操作应该就是完成tcp三次握手
# 此函数的5表示已经完成三次握手的客户端最大数量,但是这些客户端还未与服务器交互数据

sock.listen(5)

4、connect

# 此函数只应该用于客户端,因为客户端才需要连接服务器的端口
# 此函数一旦启动,则会在客户端上随机选取本地端口
# 此函数的语义是发起tcp三次握手

sock.connect(('127.0.0.1', 8080))

5、accept

# 此函数应该用于服务器,当tcp三次握手完成之后,服务器通过此函数获取此客户端socket对象和地址。
# 此函数是一个阻塞函数,即,如果服务器没有任何虚链路完成,将会无限阻塞,直到有一个虚链路通过
# listen完成,accept才会返回。
# 如果要服务器提供无限接收客户端的功能,应该循环此函数以提供链路循环

conn, addr = sock.accept()

6、recv

# 此函数用于从一个socket对象(管道)中获取数据,而实际上,是从操作系统的网卡缓存中获取数据
# 可以指定需要一次获取的字节数,获取得到的数据是bytes类型,需要decode才方便阅读
# 此函数是一个阻塞函数,即,如果网卡缓存没有任何数据,则会一直阻塞到数据到达为止

msg = conn.recv()

7、send

# 此函数用于将bytes类型的数据发送给socket对象(管道),而实际上,是发送给网卡缓存,后续交由
# 操作系统真正的发送数据。
# 此函数非阻塞,可以直接返回,不过要特别注意的是,msg如果为空,此函数可以正确执行,但是实际上
# 操作系统是没有发送数据给对端的。这样会产生一些socket连接的问题,所以要杜绝发空。

conn.send(msg)

8、close

# 关闭虚链路

conn.close()

9、getpeername

# 获取一个虚链路对端的地址二元组

print(sock.getpeername())

4、粘包问题

根本原因:tcp面向流,无法区分消息之间的数据边界,固定recv就会导致消息粘包
解决思路:每次recv的时候动态获取,并准确的获取一个消息的长度
解决办法:每一个消息都增加固定长度的报头。每次recv的时候先获取固定长度的报头,从报头中获取本次消息的准确长度,然后再recv完整准确的信息。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
10天前
|
机器学习/深度学习 运维 Python
python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
|
6天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】循环神经网络(RNN)与LSTM详解
【4月更文挑战第30天】本文探讨了处理序列数据的关键模型——循环神经网络(RNN)及其优化版长短期记忆网络(LSTM)。RNN利用循环结构处理序列依赖,但遭遇梯度消失/爆炸问题。LSTM通过门控机制解决了这一问题,有效捕捉长距离依赖。在Python中,可使用深度学习框架如PyTorch实现LSTM。示例代码展示了如何定义和初始化一个简单的LSTM网络结构,强调了RNN和LSTM在序列任务中的应用价值。
|
6天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】卷积神经网络(CNN)的原理与应用
【4月更文挑战第30天】本文介绍了卷积神经网络(CNN)的基本原理和结构组成,包括卷积层、激活函数、池化层和全连接层。CNN在图像识别等领域表现出色,其层次结构能逐步提取特征。在Python中,可利用TensorFlow或PyTorch构建CNN模型,示例代码展示了使用TensorFlow Keras API创建简单CNN的过程。CNN作为强大深度学习模型,未来仍有广阔发展空间。
|
6天前
|
机器学习/深度学习 自然语言处理 语音技术
【Python 机器学习专栏】Python 深度学习入门:神经网络基础
【4月更文挑战第30天】本文介绍了Python在深度学习中应用于神经网络的基础知识,包括神经网络概念、基本结构、训练过程,以及Python中的深度学习库TensorFlow和PyTorch。通过示例展示了如何使用Python实现神经网络,并提及优化技巧如正则化和Dropout。最后,概述了神经网络在图像识别、语音识别和自然语言处理等领域的应用,并强调掌握这些知识对深度学习的重要性。随着技术进步,神经网络的应用将持续扩展,期待更多创新。
|
6天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python用线性回归和TensorFlow非线性概率神经网络不同激活函数分析可视化
Python用线性回归和TensorFlow非线性概率神经网络不同激活函数分析可视化
|
6天前
|
机器学习/深度学习 PyTorch 算法框架/工具
Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
|
7天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver
|
7天前
|
网络协议 小程序 数据库
轻松学会Python网络编程,搭建属于自己的聊天室
轻松学会Python网络编程,搭建属于自己的聊天室
|
7天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化
Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化
|
8天前
|
机器学习/深度学习 数据可视化 数据挖掘
Python电力负荷:ARIMA、LSTM神经网络时间序列预测分析
Python电力负荷:ARIMA、LSTM神经网络时间序列预测分析