之前我在关于计算机基础知识中说过了关于UDP的数据传输,它的特点是简单但是数据容易丢失,如果接受方失去连接,数据的发送方依旧会继续发送消息。就像两个人在使用对讲机讲话,一个人关闭了对讲机,另一个人依旧会讲话,但是这个人已经不会接受任何信息。UDP通过数据包(Datagram)进行传输。
在java中我们使用对象DatagramSocket进行传输。我们现在通过API进行查看
这里涉及到了关于计算机网络中中分组转发的知识,具体的细节我不在讲述。
接下来我们需要将数据报放在数据报包中进行传输,而接受数据的一方同样需要解析数据报包中的数据进行解析数据。但是刚才我们发现,接受方不需要知道发送方的地址,但是发送方需要指明接收方的IP地址。所以这个数据报包的构造方法给了我们不同的选择来判断是发送方还是接受方。
在这个构造方法中进行了很好的体现。
下面我将用我的代码来解释UDP的数据传输方是怎样工作的。
package com.xt.my.test.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 面向无连接
* UDP传输实例
* @author Administrator
*
*/
public class UDPSendDemo {
/**
* 需求: 建立udp的发送端
* 思路:
* 1.建立可以实现udp传输的socket服务
* 2.明确具体发送的数据
* 3.通过socket服务将具体的数据发送出去
* 4.关闭服务
* @throws IOException
*/
public static void main(String[] rags) throws IOException{
System.out.println("UDP发送服务启动");
//创建UDP服务
DatagramSocket ds = new DatagramSocket();
//明确数据
String str = "这是UDP发送的消息";
//发送数据,将数据封装到数据包中
//数据包会明确目的地址和端口
byte[] buf = str.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.3.255"), 10000);
//发送
ds.send(dp);
//关闭
ds.close();
}
}
这个还是比较简单的,数据在数据报包中是通过字节流的形式进行传输的,同时作为传输方我们需要制定我们的接受方的IP地址。
那么在数据的接受方,方法是类似的。既然我们将数据以字节流的形式进行传输,那么自然我们需要将数据以字节数组的形式进行接收。在我们获取数据报包后可以解析里面的数据。
package com.xt.my.test.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPRecieveDemo {
public static void main(String[] args) throws IOException {
/**
* 创建udp的接收端
* 思路
* 1.创建socket的接收端,明确一个端口
* 2.接受数据
* 3.将其中需要的数据取出 ip 数据 字符串
* 4. 关闭资源
*
*/
System.out.println("UDP接受端启动");
//1.创建Socket服务
DatagramSocket ds= new DatagramSocket(10000);
//2 接受数据,需要将收到的数据存储到数据包中,
//可以通过数据包对象的方法对收到的数据进行解析
//创建一个数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
//通过数据包对象解析收到的数据
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"<--->"+port+"<---->"+str);
ds.close();
}
}
在这个过程我们可以看到在ds.receive方法中,数据传输到了我们的接受数据报包中。之后我们对我们获取的数据进行解析。
要有几点进行注意。我们来看这两行代码。
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.3.255"), 10000);
DatagramSocket ds= new DatagramSocket(10000);
我们在设置InetAddress的IP地址时,一定要设置成我们所在网段开启的IP地址。另外在指定接受方的端口号(port)要和接受方的
DatagramSocket套接字绑定的端口号一致,否则依旧无法测试。另外在测试数据时,要先启动接收端,再启动发送端。