目录
一、InetAddress类的使用
二、UDP协议之发送数据(单播)
三、UDP协议之接收数据
四、UDP小练习之聊天室
五、UDP之单播、组播、广播
(一)组播之发送数据、接收数据
(二)广播之发送数据、接收数据
一、InetAddress类的使用
获取InetAddress对象,是用来获取一台设备的相关信息。
getByName():确定主机名称的IP地址
getHostName():获取IP地址的主机名
getHostAddress():返回文本显示中的IP地址字符串
import java.net.InetAddress;
import java.net.UnknownHostException;
public class MyInetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
//1.获取InetAddress对象
//ip的对象,一台电脑
//确定主机名称的IP地址。主机名称可以是机器名称也可以是IP地址
InetAddress address=InetAddress.getByName("LAPTOP-4R4O0SD4");
System.out.println(address);
//获取IP地址的主机名
String name=address.getHostName();
System.out.println(name);
//返回文本显示中的IP地址字符串
String ip=address.getHostAddress();
System.out.println(ip);
}
}
二、UDP协议之发送数据(单播)
package a02UDPdemo;
import java.io.IOException;
import java.net.*;
/*
UDP面向无连接的通信协议
速度快、一次最多发送64K、数据不安全、容易丢失数据
看视频、语音通话、视频会议、
TCP面向连接的通信协议
速度慢。没有大小限制、数据安全
下载安装包、文字聊天、发送邮件
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//发送数据
//1.创建DatagramSocket对象(快递公司)
//细节:绑定端口,就是通过这个端口往外发送数据
//空参:所有可用端口随机选择一个
//有参:指定端口号
DatagramSocket datagramSocket=new DatagramSocket();
String str="udp发送数据";
byte []bytes =str.getBytes();//发送的数据
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");//要发送到的设备
int port=10086;//要发送到主机的端口号
//2.打包数据(DatagramPacket)
DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);//有很多传参方式
//3.发送数据
datagramSocket.send(datagramPacket);
//4.释放资源
datagramSocket.close();
}
}
三、UDP协议之接收数据
package a02UDPdemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//接收数据
//1.创建DatagramSocket对象(快递公司)
//细节:
//接收的时候一定要绑定端口
//而且绑定的端口一定要跟发送的端口保持一致
DatagramSocket datagramSocket=new DatagramSocket(10086);
//2.接收数据包
byte [] bytes =new byte[1024];//用于接收数据的数组大小
DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//bytes.length表示用数组全部的空间去接收数据
//该方法是阻塞的,程序执行到receive,会在这里死等,等待发送端发送数据
System.out.println(1111);
datagramSocket.receive(datagramPacket);
System.out.println(2222);//如果发送端没有发送数据,就不会打印2222
//3.解析数据包
byte[] data= datagramPacket.getData();
int len=datagramPacket.getLength();
int port=datagramPacket.getPort();
InetAddress address=datagramPacket.getAddress();
System.out.println("接收到数据"+new String(data,0,len));
System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");
//4.释放资源
datagramSocket.close();
}
}
小贴士:先运行send在运行receive
四、UDP小练习之聊天室
按照下面的要求实现程序:
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* 按照下面的要求实现程序
* UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
* UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//1.创建对象
DatagramSocket datagramSocket=new DatagramSocket();
while (true) {
//2.打包数据
Scanner scanner=new Scanner(System.in);
System.out.println("请输入您想输入的话");
String str= scanner.nextLine();
if("886".equals(str)){
break;
}
byte []bytes=str.getBytes();
int port=10086;
InetAddress address=InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length,address,port);
//3.发送数据
datagramSocket.send(datagramPacket);
}
//4.释放资源
datagramSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 按照下面的要求实现程序
* UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
* UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
*/
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//1.创建对象
DatagramSocket datagramSocket=new DatagramSocket(10086);
//2.接收数据包
byte []bytes=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
while (true) {
datagramSocket.receive(datagramPacket);
//3.解析数据包
String ip=datagramPacket.getAddress().getHostAddress();
String name=datagramPacket.getAddress().getHostName();
int port= datagramPacket.getPort();
byte data[]=datagramPacket.getData();
int length=datagramPacket.getLength();
//4.打印数据
System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
}
// //4.释放资源
// datagramSocket.close();
}
}
可以开启多个启动运行来模拟多个设备发送数据,如下图所示,开启三个send类来模拟三个用户,一个receive类模拟聊天室接收数据。先运行send类在运行receive类。
五、UDP之单播、组播、广播
(一)组播之发送数据、接收数据
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
/**
* UDP发送方式分为:单播、组播、广播
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
/*
组播发送端代码
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址
*/
//1.创建MulticastSocket对象
MulticastSocket multicastSocket=new MulticastSocket();
//2.创建DatagramPacket对象
String str="您好";
byte []bytes=str.getBytes();
int port=10000;
InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length,address,port);
//3.调用MulticastSocket发送数据方法发送数据
multicastSocket.send(datagramPacket);
//4.释放资源
multicastSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ReceiveMessageDemo1 {
public static void main(String[] args) throws IOException {
/*
组播接收端代码
*/
//1.创建MulticastSocket对象
MulticastSocket multicastSocket=new MulticastSocket(10000);
//2.将当前本机,添加到224.0.0.1这一组中
InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
multicastSocket.joinGroup(address);
//3.创建DatagramPacket数据包对象
byte []bytes=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
//4.接收数据
multicastSocket.receive(datagramPacket);
//5.解析资源
String ip=datagramPacket.getAddress().getHostAddress();
String name=datagramPacket.getAddress().getHostName();
int port= datagramPacket.getPort();
byte data[]=datagramPacket.getData();
int length=datagramPacket.getLength();
System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
//6.释放资源
multicastSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ReceiveMessageDemo2 {
public static void main(String[] args) throws IOException {
/*
组播接收端代码
*/
//1.创建MulticastSocket对象
MulticastSocket multicastSocket=new MulticastSocket(10000);
//2.将当前本机,添加到224.0.0.1这一组中
InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
multicastSocket.joinGroup(address);
//3.创建DatagramPacket数据包对象
byte []bytes=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
//4.接收数据
multicastSocket.receive(datagramPacket);
//5.解析资源
String ip=datagramPacket.getAddress().getHostAddress();
String name=datagramPacket.getAddress().getHostName();
int port= datagramPacket.getPort();
byte data[]=datagramPacket.getData();
int length=datagramPacket.getLength();
System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
//6.释放资源
multicastSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ReceiveMessageDemo3 {
public static void main(String[] args) throws IOException {
/*
组播接收端代码
*/
//1.创建MulticastSocket对象
MulticastSocket multicastSocket=new MulticastSocket(10000);
//2.将当前本机,添加到224.0.0.1这一组中
InetAddress address=InetAddress.getByName("224.0.0.2");//指定组播地址ip
multicastSocket.joinGroup(address);
//3.创建DatagramPacket数据包对象
byte []bytes=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
//4.接收数据
multicastSocket.receive(datagramPacket);
//5.解析资源
String ip=datagramPacket.getAddress().getHostAddress();
String name=datagramPacket.getAddress().getHostName();
int port= datagramPacket.getPort();
byte data[]=datagramPacket.getData();
int length=datagramPacket.getLength();
System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
//6.释放资源
multicastSocket.close();
}
}
其中ReceiveMessageDemo3并不会收到发来的数据。因为它指定的组播地址不是send类指定的组播地址。
(二)广播之发送数据、接收数据
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
/**
* UDP发送方式分为:单播、组播、广播
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
/*
广播发送端代码
组播地址:255.255.255.255
*/
//1.创建DatagramSocket对象
DatagramSocket datagramSocket=new DatagramSocket();
String str="udp发送数据";
byte []bytes =str.getBytes();//发送的数据
InetAddress inetAddress=InetAddress.getByName("255.255.255.255");//要发送到的设备
int port=10086;//端口号
//2.打包数据(DatagramPacket)
DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);//有很多传参方式
//3.发送数据
datagramSocket.send(datagramPacket);
//4.释放资源
datagramSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
/*
广播接收端代码
*/
//1.创建DatagramSocket对象
DatagramSocket datagramSocket=new DatagramSocket(10086);
//2.接收数据包
byte [] bytes =new byte[1024];//用于接收数据的数组大小
DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//bytes.length表示用数组全部的空间去接收数据
datagramSocket.receive(datagramPacket);
//3.解析数据包
byte[] data= datagramPacket.getData();
int len=datagramPacket.getLength();
int port=datagramPacket.getPort();
InetAddress address=datagramPacket.getAddress();
System.out.println("接收到数据"+new String(data,0,len));
System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");
//4.释放资源
datagramSocket.close();
}
}