UDP和TCP网络编程
UDP和TCP
套接字(socket): 实现网络编程进行数据传输的一种技术手段,网络上的各种网络服务大多都是基于socket来完成通信的。
python套接字编程模块:import socket
UDP套接字编程:
. 创建套接字
sockfd=socket.socket(socket_family,socket_type,proto=0)功能:创建套接字参数:socket_family 网络地址类型 AF_INET表示ipv4socket_type 套接字类型 SOCK_DGRAM 表示udp套接字 (也叫数据报套接字) proto 通常为0 选择子协议返回值: 套接字对象
绑定地址
- 本地地址 : ‘localhost’ , ‘127.0.0.1’
- 网络地址 : ‘172.40.91.185’ (通过ifconfig查看)
- 自动获取地址: ‘0.0.0.0’
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B2PZwW8D-1605430266465)(C:\Users\hans_\Downloads\address.png)]
sockfd.bind(addr)功能: 绑定本机网络地址参数: 二元元组 (ip,port) ('0.0.0.0',8888)
- 消息收发
data,addr = sockfd.recvfrom(buffersize)功能: 接收UDP消息参数: 每次最多接收多少字节返回值: data 接收到的内容addr 消息发送方地址n = sockfd.sendto(data,addr)功能: 发送UDP消息参数: data 发送的内容 bytes格式addr 目标地址返回值:发送的字节数
- 关闭套接字
sockfd.close()功能:关闭套接字
服务端客户端流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfBetFzl-1605430266467)(C:\Users\hans_\Downloads\11.png)]
UDP套接字特点
- 可能会出现数据丢失的情况
- 传输过程简单,实现容易
- 数据以数据包形式表达传输
- 数据传输效率较高
TCP传输方法
TCP传输特点
. 面向连接的传输服务
传输特征 : 提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。
可靠性保障机制(都是操作系统网络服务自动帮应用完成的):
. 在通信之前确定数据连接
. 确认应答机制
. 通信结束要正常的断开链接
. 三次握手(建立连接):
客户端向服务器发送信息报文请求连接
服务器收到请求后,回复报文确定可以连接
客户端收到回复后,发送最终报文连接建立
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZEwRf2Z-1605430266469)(C:\Users\hans_\Downloads\1_scws.png)]
. 四次挥手(断开连接):
- 主动方发送报文请求断开连接
- 被动方收到请求后,立即回复,表示准备断开
- 被动方准备就绪,再次发送报文表示可以断开
- 主动方收到确定,发送最终报文完成断开
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTEwTQsg-1605430266471)(./img/1_schs.png)]
TCP服务端
- 创建套接字
sockfd=socket.socket(socket_family,socket_type,proto=0)功能:创建套接字参数:socket_family 网络地址类型 AF_INET表示ipv4socket_type 套接字类型 SOCK_STREAM 表示tcp套接字 (也叫流式套接字) proto 通常为0 选择子协议返回值: 套接字对象
绑定地址 (与udp套接字相同)
设置监听
sockfd.listen(n)功能 : 将套接字设置为监听套接字,确定监听队列大小参数 : 监听队列大小
- 处理客户端连接请求
connfd,addr = sockfd.accept()功能: 阻塞等待处理客户端请求返回值: connfd 客户端连接套接字addr 连接的客户端地址
- 消息收发
data = connfd.recv(buffersize)功能 : 接受客户端消息参数 :每次最多接收消息的大小返回值: 接收到的内容n = connfd.send(data)功能 : 发送消息参数 :要发送的内容 bytes格式返回值: 发送的字节数关闭套接字 (与udp套接字相同)
关闭套接字
TCP客户端
- 创建TCP套接字
- 请求连接
sockfd.connect(server_addr)功能:连接服务器参数:元组 服务器地址
- 收发消息
注意: 防止两端都阻塞,recv send要配合
- 关闭套接字
TCP套接字细节
tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
tcp连接中如果一端已经不存在,仍然试图通过send向其发送数据则会产生BrokenPipeError
一个服务端可以同时连接多个客户端,也能够重复被连接
tcp粘包问题
产生原因
- 为了解决数据再传输过程中可能产生的速度不协调问题,操作系统设置了缓冲区
- 实际网络工作过程比较复杂,导致消息收发速度不一致
- tcp以字节流方式进行数据传输,在接收时不区分消息边界
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SjIXFVM3-1605430266473)(./img/13.jpg)]
带来的影响
- 如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
处理方法
- 人为的添加消息边界,用作消息之间的分割
- 控制发送的速度
TCP与UDP对比
- 传输特征
- TCP提供可靠的数据传输,但是UDP则不保证传输的可靠性
- TCP传输数据处理为字节流,而UDP处理为数据包形式
- TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高
- 套接字编程区别
- 创建的套接字类型不同
- tcp套接字会有粘包,udp套接字有消息边界不会粘包
- tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要
- tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom
- 使用场景
- tcp更适合对准确性要求高,传输数据较大的场景
- 文件传输:如下载电影,访问网页,上传照片
- 邮件收发
- 点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
- udp更适合对可靠性要求没有那么高,传输方式比较自由的场景
- 视频流的传输: 如直播,视频聊天
- 广播:如网络广播,群发消息
- 实时传输:如游戏画面
字使用sendto,recvfrom
- tcp更适合对准确性要求高,传输数据较大的场景
- 使用场景
- tcp更适合对准确性要求高,传输数据较大的场景
- 文件传输:如下载电影,访问网页,上传照片
- 邮件收发
- 点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
- udp更适合对可靠性要求没有那么高,传输方式比较自由的场景
- 视频流的传输: 如直播,视频聊天
- 广播:如网络广播,群发消息
- 实时传输:如游戏画面
- 在一个大型的项目中,可能既涉及到TCP网络又有UDP网络
- tcp更适合对准确性要求高,传输数据较大的场景
UDP和TCP网络编程相关推荐
- 网络编程——TCP网络编程UDP编程
1.计算机网络:将分布在不同区域不同地方的多台计算机和网络设备通过线程连接起来组成一套大型系统,来实现计算机之间的信息传递和资源共享的设备. 2.网络编程:编写一个程序来实现网络间信息传递. 网络编程 ...
- Java网络编程,使用Java实现UDP和TCP网络通信协议,以及基于UDP的在线聊天室。
文章目录 前言 一.网络编程概念 1.网络 2. 网络编程的目的 3.想要达到这个效果需要什么 4.网络分层 二.网络编程Java类 1.IP地址:InetAddress 2.端口 3.TCP连接 3 ...
- 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等
文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...
- 【计算机网络】Linux环境中的TCP网络编程
文章目录 前言 一.TCP Socket API 1. socket 2. bind 3. listen 4. accept 5. connect 二.封装TCPSocket 三.服务端的实现 1. ...
- tcp网络编程客户端和服务端及listen和tcp允许最大连接数
tcp网络编程 tcp网络编程步骤: 由于tcp传输特点是可靠有连接,那么就有 1.客户端向服务端发送连接请求(SYN), 2.服务端接受请求并向客户端发送(SYN+ACK); 3.客户端向服务端回复 ...
- TCP网络编程的基本流程
TCP网络编程的基本流程 对于服务端,通常为以下流程: 调用socket函数创建socket 调用bind函数将socket绑定到某个IP和端口上 调用listen开始监听 当有客户端请求连接上来时, ...
- muduo学习笔记:net部分之实现TCP网络编程库-Buffer
文章目录 为什么采用non-blocking网络编程中应用层buffer是必需的? Buffer 设计 Buffer::readFd() 线程安全 Muduo Buffer 的数据结构 Muduo B ...
- TCP网络编程 [Java]
TCP网络编程 这里我们通过一个例子来了解什么是TCP网络编程: eg: 问题: -> 从客户端发送文件到服务端,服务端将接受到的客户端发来的文件存储到本地之后并返回一个发送成功给客户端,并关闭 ...
- 套接字编程-TCP网络编程
文章目录 套接字地址结构 通用套接字地址数据结构 以太网协议的套接字地址数据结构 Netlink协议套接字地址结构 TCP网络编程 套接字初始化socket() domain type protoco ...
最新文章
- 【刘文彬】RPC的基础:调研EOS插件http_plugin
- java怎么添加地图_javaweb怎样添加百度地图
- R语言:随机抽样(sample函数)
- 前端工业物联网开发(Electron + Typescript + Vue)
- BZOJ4293 Siano
- python数据结构中文版_Python官方入门教程_中文版_5.数据结构
- 一个java写的贪吃蛇程序
- SpringBoot整合RabbitMQ之Topic Exchange通配符交换机(学习总结)
- jdk帮助文档在哪_jdk帮助文档在哪里下载
- 鲁棒控制(Ⅰ)—LMI处理方法
- 在北极都可以穿短袖了,温度飙升至32.5℃
- 根据WebService地址展示方法列表、入参和返回值(解析wsdl)
- 统计中几个常用术语一
- 企业微信全员群关闭是什么意思?如何开启全员群?
- c语言表示整型变量,在表示 C语言的整型变量时,表示“无符号长整型”的符号是( )。...
- 基于公众号二次开发的聊天实现
- C语言中在写输入代码时,在几个%d之间不加空格分开,与用逗号分开,以及采用a=%d,这样写的输入代码有什么区别呢?
- 计算机进程关闭后又重启,Windows 10电脑关机后又自动重启如何解决
- 「津津乐道播客」#201. 用声音聚众,聊聊这个不寻常的春节
- node获取响应头Authorization的方法