利用UDP通信的两个端点是平等的,也就是说通信的两个程序关系是对等的,没有主次之分,甚至它们的代码都可以完全一致,这一点要与基于TCP协议的Socket编程区分开来。
步骤:
1、利用DatagramPacket对象封装数据包。
2、利用DatagramSocket对象发送数据包。
3、利用DatagramSocket对象接收数据包。
4、利用DatagramPacket对象处理数据包。
模拟客户咨询的功能,实现:发送方发送咨询问题,接收方接收显示发送来的咨询问题。
发送方实现步骤:
1、获取本地主机的InetAddress对象。
2、创建DatagramPacket对象,封装要发送的信息。
3、用DatagramSocket对象将DatagramPacket对象数据发送出去。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Sender {
public static void main(String[] args) {
try {
// 获取本地主机地址
InetAddress ia = InetAddress.getLocalHost();
Scanner can = new Scanner(System.in);
// 创建DatagramSocket对象,向接收方发送数据
DatagramSocket ds;
while (true) {
System.out.println("请输入要咨询的问题:");
String str = can.nextLine();
// 创建DatagramPacket对象,封装数据
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ia, 6000);
ds = new DatagramSocket();
ds.send(dp);
}
// 关闭DatagramSocket对象
// ds.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收方实现步骤:
1、创建DatagramPacket对象,准备接收封装的数据。
2、创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
3、利用DatagramPacket对象处理数据。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receiver {
public static void main(String[] args) {
try {
// 创建DatagramPacket对象,用来准备接收数据
DatagramSocket ds = new DatagramSocket(6000);
System.out.println("接收方已打开!");
while (true) {
// 接收数据
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
// 显示接收到的信息
String str = new String(dp.getData(), 0, dp.getData().length);
System.out.println(dp.getAddress().getHostAddress() + "发送的数据为:" + str);
}
// ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//Sender发送消息
请输入要咨询的问题:
我是谁?
请输入要咨询的问题:
你是谁?
请输入要咨询的问题:
我在干嘛?
请输入要咨询的问题:
//Receiver结果
接收方已打开!
192.168.199.153发送的数据为:我是谁?
192.168.199.153发送的数据为:你是谁?
192.168.199.153发送的数据为:我在干嘛?
<<<<=======升级=======>>>>接收方接收到发送方发送的消息之后,给发送方一个回应
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class ReceiverAndSender {
public static void main(String[] args) {
try {
// 创建DatagramPacket对象,用来准备接收数据
DatagramSocket ds = new DatagramSocket(6000);
System.out.println("接收方已打开!");
// 接收数据
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
// 显示接收到的信息
String str = new String(dp.getData(), 0, dp.getData().length);
System.out.println(dp.getAddress().getHostAddress() + "发送的数据为:" + str);
ds.close();
// 发送回应
// 获取本地主机地址
InetAddress ia = InetAddress.getLocalHost();
Scanner can = new Scanner(System.in);
// 创建DatagramSocket对象,向接收方发送数据
DatagramSocket ds2;
System.out.println("请输入你的回应:");
String str2 = can.nextLine();
// 创建DatagramPacket对象,封装数据
DatagramPacket dp2 = new DatagramPacket(str2.getBytes(), str2.getBytes().length, ia, 6001);
ds2 = new DatagramSocket();
ds2.send(dp2);
// 关闭DatagramSocket对象
ds2.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class SenderAndReceiver {
public static void main(String[] args) {
try {
// 获取本地主机地址
InetAddress ia = InetAddress.getLocalHost();
Scanner can = new Scanner(System.in);
System.out.println("请输入要咨询的问题:");
String str = can.nextLine();
// 创建DatagramPacket对象,封装数据
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ia, 6000);
// 创建DatagramSocket对象,向接收方发送数据
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
// 关闭DatagramSocket对象
ds.close();
// 接收数据
byte[] b = new byte[1024];
DatagramPacket dp2 = new DatagramPacket(b, b.length);
// 准备接收回应
DatagramSocket ds2 = new DatagramSocket(6001);
ds2.receive(dp2);
System.out.println("对方已回答:");
// 显示接收到的信息
String str2 = new String(dp2.getData(), 0, dp2.getData().length);
System.out.println(dp2.getAddress().getHostAddress() + "的回答:" + str2);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
请输入要咨询的问题:
我是谁?
对方已回答:
192.168.199.153的回答:你是你啊~
接收方已打开!
192.168.199.153发送的数据为:我是谁?
请输入你的回应:
你是你啊~