标签:包括 alt ack 丢失 可靠 host int oid smi
网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互联协议),它是一个包括TCP协议和IP协议,UDP(User Datagram Protocol)协议和其它一些协议的协议组。
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,第三次握手,客户端再次向服务器端发送确认信息,确认连接。由于TCP协议的面向连接特性,它可以保证传输数据的安全性,所以是一个被广泛采用的协议,例如在下载文件时,如果数据接收不完整,将会导致文件数据丢失而不能被打开,因此,下载文件时必须采用TCP协议。
前面介绍了UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。
UDP通信需要用到两个类——DatagramPacket类和DatagramSocket类。
DatagramPacket类用于封装UDP通信中发送或者接收的数据。
DatagramPacket类会用到下面两个方法


DatagramPacket类——使用这个类的实例对象就可以发送和接收DatagramPacket数据包。
这个类用到下面的方法。


UDP协议就介绍到这,下面演示文字交互代码(由于只有一台电脑所以用的是本机地址)
发送端
package com.lty.wangluojianpanluru;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
*实现UDP协议的发送端
* 实现封装数据的类java.net.DatagramPacket 将数据包装
* 实现数据传输的类java.net.DataGramPacket 将数据包发出去
*
* 实现步骤:
* 1.创建DatagramPacket对象,封装数据,接收的地址和端口
* 2.创建DatagramSocket
* 3.调用DatagramSocket类方法send,发送数据包
* 4.关闭资源
*
* DatagramPacket构造方法
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
*
* DatagramSocket构造方法:
* DatagramSocket()空参数
* 方法: send(DatagramPacket d)
* 文字交互案例思想
* 实现UDP发送,键盘输入的形式
* 输入完毕发给接收端
*/
public class UDPsend {
public static void main(String[] args) throws IOException{
Scanner sc=new Scanner(System.in);
//创建DatagramSocket对象,数据包的发送和接收对象
DatagramSocket ds =new DatagramSocket();
//创建InetAddress对象,封装自己的IP地址
InetAddress inet=InetAddress.getByName("127.0.0.1");
while(true) {
String message=sc.nextLine();
//创建数据包对象,封装要发送的数据,接收端IP,端口
byte[] date=message.getBytes();
DatagramPacket dp=new DatagramPacket(date,date.length,inet,5000);
//调用ds对象的方法send,发送数据包
ds.send(dp);
}
// ds.close();
}
}
接收端
package com.lty.wangluojianpanluru;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* 实现UDP协议的接收端
* 实现封装数据的类java.net.DatagramPacket 将数据包接收
* 实现数据输出的类java.net.DataGramPacket 接收数据包
*
* 实现步骤:
* 1.创建DatagramSocket对象,绑定端口号
* 要和发送端端口号一致
* 2.创建字节数组,接收发来的数据
* 3.创建数据包对象DatagramPacket
* 4.调用DatagramSocket对象方法
* received(DatagramPacket dp)接收数据,数据放在数据包中
* 5.拆包
* 发送的IP地址
* 数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象
* 返回值是InetAddress对象
* 接收到的字节个数
* 数据包对象DatagramPacket方法getLength()
* 发送方的端口号
* 6.关闭资源
*
*文字交互案例思想
* 实现UDP协议的接收端
* 永不停歇的接收端
*
*/
public class UDPReceive {
public static void main(String[] args) throws IOException{
// 创建数据包传输对象DatagramSocket 绑定端口号
DatagramSocket ds=new DatagramSocket(5000);
//创建字节数组
byte[] data = new byte[1024];
//创建数据包对象,传递字节数组
while(true) {
DatagramPacket dp=new DatagramPacket(data,data.length);
//调用ds对象的方法receive传递数据包
ds.receive(dp);
//获取发送端的IP地址对象
String ip=dp.getAddress().getHostAddress();
//获取接收到的字节个数
int length = dp.getLength();
System.out.println(new String(data,0,length)+"....."+ip);
}
// ds.close();
}
}
因为无论发送还是接收都不可能只进行一次,所以会有死循环。
标签:包括 alt ack 丢失 可靠 host int oid smi
原文地址:https://www.cnblogs.com/GoodBless/p/11040640.html