UDP发送:
需求:通过udp传输方式,将一段文字数据发送出去。
思路:
1、建立udpsocket服务
2、提供数据,并将数据封装到数据包中
3、通过socket服务的发送功能,将数据包发送出去。
4、关闭资源。
DatagramSocket:此类表示用来发送和接收数据报包的套接字。在 DatagramSocket 上总是启用 UDP 广播发送。
DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
udp发送端代码:
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 UDPSend {
public static void main(String[] args) throws IOException {
//1、创建udp服务,通过DategramSocket对象;
DatagramSocket ds=new DatagramSocket();
//2、确定数据,并封装数据到数据包.DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int length, InetAddress address, int port)
String string="udp data comes";
byte[] buf=string.getBytes();//getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("10.1.9.34"),10000);
//3、通过socket服务,将已有的数据报发送出去,通过send方法。
ds.send(dp);
//4、关闭资源
ds.close();
}
}
udp接收端
需求:定义一个应用程序,用于接收数据并处理
思路:
1、定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义一个数字标识,方便于明确哪些数据过来该应用程序可以处理;
2、定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提前字节数据中的不同数据信息。
3、通过socket服务的recieve方法将收到的数据存入一定义好的数据包中;
4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上;
5、关闭资源。
udp发送端代码:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpRecive { public static void main(String[] args) throws IOException { //1、创建udpsocket服务,建立端点 DatagramSocket ds=new DatagramSocket(10000); //2、定义一个数据包,用于存储数据。DatagramPacket(byte[] buf, int length) byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf, buf.length); //3、通过服务的receive方法将收到的数据存入数据包中 ds.receive(dp); //4、通过数据包的方法获取其中的数据。 String ip=dp.getAddress().getHostAddress(); String data=new String(dp.getData(),0,dp.getLength()); int port=dp.getPort(); System.out.println(ip+"::"+data+"::"+port); //5、关闭资源 ds.close(); } }
运行结果:
数据是从56375端口发送出去的,发送到10000这个接口,因为发送端端口自己没有指定,是系统随机分配的
UDP键盘录入数据
发送端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPSend2 {
public static void main(String[] args) throws UnknownHostException, IOException {
DatagramSocket ds=new DatagramSocket();
BufferedReader buff=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=buff.readLine())!=null){
if("886".equals(line)){
break;
}
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("10.1.9.34"),10000);
ds.send(dp);
}
ds.close();
}
}
接收端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPRecive2 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10000);
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data);
}
}
}
先运行接收端,在运行发送端:
结果如下:
这种通信是点对点的通信,如果需要同一网段的所有人都收到,可通过发送广播地址。比如把上述地址改为:10.1.9.255