udp:数据报文(包)协议
DatagramPacket====传输层
=UDP
DatagramSocket传输层
有三种:
单播:是指只向一个固定的机器发送包
广播:是向255.255.255.255发送,所有监听某端口的机器都可以接收到
组播:是向一个用户组发送,该组里面所有用户可以接收到
DatagramPacket有2个作用
1.发送的包===>要给定发送的内容以及发送的地址与端口
DatagramPacket dp =
new DatagramPacket(byte[],0,length,InetAddress,port);
2.接收的包===>只要指定接收包的大小
DatagramPacket dp =
new DatagramPacket(byte[],0,length);
DatagramSocket有2个作用
1.发送的人===>只需要new出来就可以了
DatagramSocket ds = new DatagramSocket();
2.接收的人===>需要指定接收的地址以及端口
DatagramSocket ds = new DatagramSocket(port,InetAddress);
对于三种udp协议
1.发送方完全相同,单播是指定一个ip
广播是指定255.255.255.255这个ip
组播是指定D类ip(224-239)
2.接收方单播直接指定一个ip与端口
广播不能指定ip,只要端口
组播要使用MulticastSocket,
让后使用joinGroup加入该组
发送
public static void main(String[] args) throws Exception {
/**
* TCP协议(有连接的协议)
* 客户端 socket
* 服务器 serversocket
*
* UDP协议(无连接的协议)
* 单播
* 广播
* 组播
*/
DatagramSocket socket =new DatagramSocket();
System.out.println("套接字建立");
String msg="测试";
//单播和广播的区别就是地址不同
DatagramPacket dp=new DatagramPacket(msg.getBytes(),msg.getBytes().length, InetAddress.getByName("255.255.255.255"),1122);
socket.send(dp);
socket.close();
System.out.println("已经发送了");
}
}
接收
public static void main(String[] args) throws Exception {
DatagramSocket socket=new DatagramSocket(1122);
//数据包
byte[]bs=new byte[100];
DatagramPacket packet=new DatagramPacket(bs,100);
socket.receive(packet);
System.out.println(new String(bs).trim());
socket.close();
}
组播
public static void main(String[] args) throws Exception {
DatagramSocket socket =new DatagramSocket();
System.out.println("套接字建立");
String msg="测试";
//单播和广播的区别就是地址不同
//组播
DatagramPacket dp=new DatagramPacket(msg.getBytes(),msg.getBytes().length, InetAddress.getByName("227.0.0.0"),1122);
socket.send(dp);
socket.close();
System.out.println("已经发送了");
}
public static void main(String[] args) throws Exception {
//需要跨机聊天要关闭防火墙
MulticastSocket socket=new MulticastSocket(1122);
//可以加入多个
socket.joinGroup(InetAddress.getByName("227.0.0.0"));
// DatagramSocket socket=new DatagramSocket(1122);
//数据包
byte[]bs=new byte[100];
DatagramPacket packet=new DatagramPacket(bs,100);
socket.receive(packet);
System.out.println(new String(bs).trim());
//退出
socket.leaveGroup(InetAddress.getByName("227.0.0.0"));
//关闭
socket.close();
}