UDP和TCP

Socket套接字

概念

Socket套接字是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。

分类

Socket套接字主要针对传输层协议划分为如下三类:

流套接字 :使用传输层 TCP 协议
数据报套接字 :使用传输层 UDP 协议
原始套接字:原始套接字用于自定义传输层协议,用于读写内核没有处理的 IP 协议数据。

 

Java数据报套接字通信模型 

对于UDP协议来说,有以下特点:

1)无连接

2)不可靠传输

3)面向数据报

4)有接受缓冲区,无发送缓冲区

5)大小受限,一次最多传输64k

java中使用UDP协议通信,主要是通过DatagramSocket类来创建数据报套接字。

并使用DatagramPacket作为发送或接受的UDP数据报。

Socket编程注意事项

1. 客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务端,但真实的场
景,一般都是不同主机。
2. 注意目的 IP 和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程。
3. Socket 编程我们是使用流套接字和数据报套接字,基于传输层的 TCP UDP 协议,但应用层协议,也需要考虑,这块我们在后续来说明如何设计应用层协议。
4. 关于端口被占用的问题, 如果一个进程 A 已经绑定了一个端口,再启动一个进程 B 绑定该端口,就会报错,这种情况也叫端 口被占用。
解决端口被占用的问题
  • 如果占用端口的进程A不需要运行,就可以关闭A后,再启动需要绑定该端口的进程B
  • 如果需要运行A进程,则可以修改进程B的绑定端口,换为其他没有使用的端口。

UDP数据报套接字编程

DatagramSocket API

构造方法
方法签名方法说明
DatagramSocket()
创建一个 UDP 数据报套接字的 Socket ,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port)
创建一个 UDP 数据报套接字的 Socket ,绑定到本机指定的端口(一般用于服务端)
方法
方法签名方法说明
void receive(DatagramPacket p)
从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacket
p)
从此套接字发送数据报包(不会阻塞等待,直接发送)
void close()
关闭此数据报套接字

DatagramPacket API

构造方法
方法签名方法说明
DatagramPacket(byte[]
buf, int length)
构造一个 DatagramPacket 以用来接收数据报,接收的数据保存在字节数组(第一个参数buf )中,接收指定长度(第二个参数length)
DatagramPacket(byte[]
buf, int offset, int length, SocketAddress address)
构造一个 DatagramPacket 以用来发送数据报,发送的数据为字节数组(第一个参数buf )中,从 0 到指定长度(第二个参数length)。 address 指定目的主机的 IP 和端口号
方法
方法签名方法说明
InetAddress getAddress()
从接收的数据报中,获取发送端主机 IP 地址;或从发送的数据报中,获取接收端主机IP 地址
int getPort()
从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData()
获取数据报中的数据

InetSocketAddress API

TCP流套接字编程

ServerSocket API

构造方法
方法签名方法说明
ServerSocket(int port)
创建一个服务端流套接字 Socket ,并绑定到指定端口
方法
方法签名方法说明
Socket accept()
开始监听指定端口(创建时绑定的端口),有客户端连接后,返回一个服务端 Socket对象,并基于该Socket 建立与客户端的连接,否则阻塞等待
void close()
关闭此套接字

Socket API

Socket 是客户端 Socket ,或服务端中接收到客户端建立连接( accept 方法)的请求后,返回的服务端Socket。
不管是客户端还是服务端 Socket ,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。
构造方法
方法签名方法说明
Socket(String host, int port)
创建一个客户端流套接字 Socket ,并与对应 IP 的主机上,对应端口的进程建立连接
方法
方法签名方法说明
InetAddress getInetAddress()
返回套接字所连接的地址
InputStream getInputStream()
返回此套接字的输入流
OutputStream getOutputStream()
返回此套接字的输出流

### UDPTCP协议的主要区别 #### 1. 基本特性对比 TCP是一种面向连接的可靠传输协议,它提供了一种全双工、有序的数据流服务。为了确保数据能够按顺序到达并被正确处理,TCP引入了复杂的握手过程(三次握手)、拥塞控制机制以及超时重传等功能[^1]。 相比之下,UDP则是一个简单的无状态协议,其设计目标是为了快速传递少量信息而不关心这些消息是否会丢失或者错位。因此,在使用UDP的情况下,应用程序本身需要承担起保障通信质量的责任[^2]。 #### 2. 性能表现差异 由于上述提到的原因,当涉及到大量连续的小型事务请求时,比如DNS查询或是在线游戏中的位置更新报文交换,则更适合采用轻量级且高效的UDP来完成;而对于那些要求高度精确性稳定性的操作——例如文件下载或远程登录会话管理等任务来说,显然更倾向于依赖于具备强健纠错能力的TCP解决方案[^3]。 另外值得注意的是,在某些特定条件下(如高带宽低延迟环境),即使存在一定的错误率也可能接受以换取更快的速度体验, 这时候也会优先考虑利用UDP来进行多媒体播放之类的活动[^4]。 #### 3. 应用实例分析 - **Web浏览**: 当用户通过浏览器访问网站时,HTTP/HTTPS协议基于TCP协议工作,确保网页数据完整、准确地传输。 - **邮件传输**: 使用诸如SMTP(简单邮件传输协议)或POP(邮局协议)等基于TCP的协议,保证邮件内容的准确送达。 - **视频会议/直播平台**: 对于此类强调即时互动的应用场合而言,尽管可能会遇到偶尔的画面卡顿现象,但由于整体上追求流畅度而非绝对准确性,所以普遍采用了支持更高帧速率但可能伴随轻微失真的UDP作为底层承载技术之一。 ```python import socket def create_tcp_socket(): """创建一个TCP套接字""" tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) return tcp_sock def create_udp_socket(): """创建一个UDP套接字""" udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return udp_sock ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值