开始前的准备
- 不需要利用IO流实现数据的传输
- 每个数据发送单元被封装为数据包,发送方将数据包发送到网络内,数据包在网络内去寻找他的目的地。
- 在下面的实例内,DatagramSocket用于发送或者接收数据包 ; DatagramPacket 是数据包的意思
示例
我们搭建一个客户端和服务器端可以双向交流的聊天室
先搭建客户端:
package net.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
* 一次双向通信
*发送方 一发一收
*/
public class Test1 {
public static void main(String[] args) throws Exception {
System.out.println("----咨询者----");
Scanner scanner = new Scanner(System.in);
//创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket(8888);// 本应于程序的端口
while (true){
//准备要发送的数据
String s = scanner.next();
byte[] buf = s.getBytes();
//创建数据报对象 ( 发送的数据 发多少 发到哪台主机 主机程序使用的端口 )
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),9999);
//发送一个数据报
ds.send(dp);
/**接收数据*/
byte[] buf2 = new byte[1024];
DatagramPacket dp2 = new DatagramPacket(buf2,buf2.length);
//借助String的构造方法查看
ds.receive(dp2); // (接收到的数据,从0开始,接收了多少个)
String str = new String(dp2.getData(),0,dp2.getLength());
System.out.println("客服说:"+str);
if ("bye".equals(s)){
break;
}
}
//关闭
ds.close();
}
}
服务器端:
package net.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;
/**
* 接收方
* 一收一发
*/
public class Test1 {
public static void main(String[] args) throws Exception {
System.out.println("----客服人员----");
Scanner scanner = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket(9999);
while (true){
//准备接收数据
byte[] buf = new byte[1024];
//创建一个数据报,用于数据接收
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收到的数据
ds.receive(dp);
//查看接收到的数据
String str = new String(dp.getData(),0,dp.getLength());
System.out.println("客户端说:"+str);
/**回复数据*/
String s = scanner.next();
byte[] buf2 = s.getBytes();
//重新创建一个 数据报 用于发送 ( 发送的数据 发了多少 发送方的地址 发送方的端口 )
DatagramPacket dp2 = new DatagramPacket(buf2,buf2.length,dp.getAddress(), dp.getPort());
//将dp2发送出去
ds.send(dp2);
if ("bye".equals(s)){
break;
}
}
ds.close();
}
}
先启动服务器端,再启动客户端,在客户端向服务器端发送一句话,之后再服务器端给出回应
在实现过程内,有什么疑问,原理上的难点,请留言,我会尽快回复