发送端,也就是客户端
public class UdpSend {
public static void main(String[] args) throws Exception {
//创建一个通道,因为是发送方,所以端口可以让系统随机配置
DatagramSocket ds=new DatagramSocket();
String str="hello,world";
//指定发送的消息内容和ip地址以及端口
DatagramPacket dp=new DatagramPacket(str.getBytes(), str.length(),InetAddress.getByName("19.1.0.0"),3000);
System.out.println("UdpSend:我要发送消息");
//这个时候系统会自动给ds配置一个端口(从运行结果可以知道这个端口是:56353)
ds.send(dp);
System.out.println("UdpSend:我发完消息了");
Thread.sleep(1000);
byte[] buf=new byte[1024];
DatagramPacket dp2=new DatagramPacket(buf, 1024);
System.out.println("UdpSend:我在等消息");
ds.receive(dp2);
System.out.println("UdpSend:我接受到消息");
String str2=new String(dp2.getData(),0,dp2.getLength())+"from"+dp2.getAddress().getHostAddress()+":"+dp2.getPort();
System.out.println(str2);
ds.close();
}
}
接收端,也就是服务器端
public class UdpRecv {
public static void main(String[] args)throws Exception {
//相当于一个通道,连通3000这个端口,相当于ds就是这个端口了(当然还要加上主机地址)
DatagramSocket ds=new DatagramSocket(3000);
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, 1024);//一个集装箱,把数据放在这个箱子中
System.out.println("UdpRecv:我在等消息");
ds.receive(dp);//接受消息,并把这里给锁住,直到接收到了消息,receive()用到了synchronized声明
System.out.println("UdpRecv:我接收到消息");
//得到消息的具体内容,还有它的主机地址以及所用的端口号
String strRecv=new String(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()
+":"+dp.getPort();
System.out.println(strRecv);
Thread.sleep(1000);
System.out.println("UdpRecv:我要发消息");
String str="hello world 12138";
//把具体的消息放到集装箱中,并且使用send()方法将其发给正在接受的地方(如果没人在接受,那这个消息就丢失了)
DatagramPacket dp2=new DatagramPacket(str.getBytes(), str.length()
,InetAddress.getByName("19.1.1.0"),dp.getPort());
ds.send(dp2);
System.out.println("UdpRecv:我发送消息结束");
//最后要把这个通道给关闭掉
ds.close();
}
}