系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
用的仍然是Socket,只不过是DatagramSocket,接收端和发送端都用的是这个
数据包:又叫数据报 DatagramPacket ,里面封装了具体的数据
习惯上叫做发送端(Sender)和接收端(Receiver)
按道理应该先启动接收端,如果我们先启动的是Sender,也没有报错(因为UDP只管发,不管有没有接收到),再去启动接收端,接收肯定接收不到了,因为Sender已经关闭,但并没有报异常。如果是TCP,先启动Cilent(发送端)会报异常
public class test {
@Test
public void Sender(){
DatagramSocket socket = null;//不要用参数,数据从哪里来,到哪里去都不会放在socket中了,而是放在数据报中
try {
socket = new DatagramSocket();
String str="采用UDP方式发送的数据";
byte[] bytes = str.getBytes();
//指定对方的IP地址
InetAddress inet = InetAddress.getByName("127.0.0.1");//或者写成InetAddress.getLocalHost(),反正这是传给自己
//对方的端口号指定为9090
//封装数据报
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,inet,9090);//数据都封装在它里面
//通过socket把数据报发出去
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket!=null){
socket.close();
}
}
}
@Test
public void Receiver(){
DatagramSocket socket= null;//指明自己的端口号
try {
socket = new DatagramSocket(9090);
byte[] bytes=new byte[100];
//把数据存到packet当中
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);//因为不是发送端,所以不要指定端口号和IP地址
//用socket去接收数据,接收到DatagramPacket当中
socket.receive(packet);
//数据本质上是在bytes当中的,下面把数据展示到控制台上
//如果这么做并不好写
//String str=new String(bytes,0,);从0开始,一直到写进去了多少个,第三个参数不好写,不知道有多少个
System.out.println(new String(packet.getData(),0,packet.getLength()));//packet.getData()是获取packet中的数据,是一个字节数组。相当于是bytes,packet.getLenth()得到写到bytes数组中多少个
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket!=null)
socket.close();
}
}
}