使用UDP实现两端互相通信

发送端 应用A,指定端口号为10000,ip地址为本地地址:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Demo2 {

	public static void main(String[] args) throws IOException {
		/*
		 * 创建UDP传输的发送端      发送快递
		 * 1.建立一个UDP的socket服务         先建立快递点
		 * 2.将要发送的数据封装到数据包中      将寄的快递封装到袋子中
		 * 3.通过UDP的scocket服务将数据包发送出去
		 * 4.关闭socket服务,释放资源
		 */
		//1.建立UDP服务     DatagramSocket
		//发送端  应用A,端口号为10000,ip为本地地址
		//指定端口号的构造函数
		DatagramSocket ds=new DatagramSocket(10000);
		//2.数据打包
		String str="哥们来了...";
		//由于DatagramPocket对象处理的都是byte类型的。所以需要将字符串转换为byte
		byte[] buf=str.getBytes();
		//buf: byte数组
		//offset:偏移量
		//length:数组的长度
		//address:对方的ip地址,要发送给谁(这里发送给自己)
		//port:发送的端口号
		DatagramPacket dp=new DatagramPacket(buf, 0, buf.length, InetAddress.getLocalHost(), 10001);
		
		//3.发送出去
		ds.send(dp);//此时可能会报IO异常
		//4.关闭服务
		ds.close();
		

	}

}

接收端 应用B,指定端口号为10001,ip地址同样采用本地地址(所以应用A与应用B在同一地址内)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Demo3 {

	public static void main(String[] args) throws IOException {
		/*
		 * 建立UDP接收端的思路               							取快递
		 * 1.建立UDP的socket服务       			  			快递点
		 * 2.创建数据包,用于存储接收的数据     					拿个袋子用于装快递
		 * 3.使用SOCKET的receive方法将接收的数据存储到数据包中    	 装入袋子中
		 * 4.通过数据包中的方法解析数据包中的数据					拆开袋子
		 * 5.关闭资源
		 */
		//1.建立UDP   socket服务
		//接收端    应用B,端口号为10001,ip为本地地址,与应用A在同一地址中
		DatagramSocket ds=new DatagramSocket(10001);
		//2.创建数据包
		byte[] buf=new byte[1024];//指定创建的数据包的大小
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		//3.使用接收方法接收数据放入数据包中
		//receive为阻塞式方法。如果没有收到东西则会一直等待,所以先运行接收端,让它等待,在运行发送端,让它发送数据
		ds.receive(dp);//将接受得到的数据包存到dp数据包中   
		//4.解析数据包中的信息
		String ip=dp.getAddress().getHostAddress();//到底是谁发过来的
		int port=dp.getPort();//从哪个端口号发过来的
		byte[] b=dp.getData();//将数据包中的数据取出放到b数组中
		String str=new String(b, 0, b.length);
		System.out.println(ip+"..."+port);
		System.out.println(str);
		//5.关闭资源
		ds.close();
		
	}

}

需要注意的问题:
receive为阻塞式方法。如果没有收到东西则会一直等待,所以先运行接收端,让它等待,再运行发送端,让它发送数据。

运行结果为:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wyhluckydog/article/details/84492478