首先我们得知道 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)。