首先我们得知道 DatagramSocket、DatagramPacket这两个类
DatagramSocket
数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
DatagramPacket
此类表示数据报包,因为Udp发送的是数据包。
InetSocketAddress
供套接字用于绑定、连接或用作返回值。就是地址
代码实现:
UdpSender(发送方)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
public class UdpSender {
public static void main(String[] args) {
SocketAddress local_addr = new InetSocketAddress("localhost", 9090);//发送方地址
try {
DatagramSocket sender = new DatagramSocket(local_addr);//发送对象
int count = 0;//设置消息数
while(count<100){
count++;
byte[] buf = (count+"hello").getBytes();//信息byte
SocketAddress receive_addr = new InetSocketAddress("localhost",8081);//接收方地址
DatagramPacket data = new DatagramPacket(buf, buf.length, receive_addr);//数据包
try {
sender.send(data);//发送消息
System.out.println("send "+count+" ---- message");
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
sender.close();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
UdpReceiver(接收方)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
public class UdpReceiver {
public static void main (String[] args){
SocketAddress local_addr = new InetSocketAddress("localhost", 8081);//接收方地址
try {
DatagramSocket receiver = new DatagramSocket(local_addr);//接收对象
while(true){
byte[] buf =new byte[10];
DatagramPacket data = new DatagramPacket(buf, buf.length);//接收数据包对象
receiver.receive(data);
String msg = new String(data.getData());
System.out.println("receive"+msg+"from"+data.getAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
send 1 ---- message
send 2 ---- message
send 3 ---- message
send 4 ---- message
send 5 ---- message
不需要建立连接直接可以发送或接收。。。
不过在接受方创建byte数组时,不会预知其大小,如果自己定义还是大一些好,不然会丢失消息,
但是弊端就是多余的会以输出结果中的方格显示。。。
小结:
一般的在接触Udp(面向非连接)之前都会了解Tcp(面向连接),这两个肯定会有对比
在这里说下自己的理解,
在 java中,Tcp建立需要一个ServerSocket对象,然后获取InputStream 和 OutputStream 对象,就可以实现通信,
其实Udp中的DatagramSocket和ServerSocket可以一样理解,只是它不需要建立连接,传送方式是数据包而不是字节数组。
当然,这些理解都只是些皮毛,以后在通信项目中还会遇更多、更复杂的问题,因为往往在一个项目中同时会应用两种
协议(比如QQ)。