InetAddress:此类表示互联网协议 (IP) 地址。
DatagramSocket:UDP端点。发送端和接收端
DatagramPacket:数据ss包
package mynet;
import java.io.IOException;
import java.net.DatagramSocket;
public class UdpSend {
/****************************************
* UDP聊天程序发送端 *
* 1.建立UDP 的 Socket 服务。 *
* 2.将要发送的数据封装到数据包中。 * 装包
* 3.通过UDP 的 Socket 服务将数据包发送出去。 *
* 4.关闭Socket服务。 *
****************************************/
/*
public static void main(String[] args) throws IOException {
//1.创建UDP发送端。。。。
DatagramSocket ds = new DatagramSocket();
//2.创建读取键盘的流对象。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//每次读取一行
String line = null;
//循环读取,循环发送。
while(true){
line = bufr.readLine();//阻塞式
byte[] buf = line.getBytes();
//将键盘读取到的数据封装到数据包中,并指定接收端地址,和端口。
DatagramPacket dp =
new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 12345);
//发送数据包
ds.send(dp);
//如果发送888。。。再见、、、
if(line.equals("888"))
break;
}
//关闭端点
ds.close();
}
*/
/****************************************
* UDP聊天程序接收端 *
* 1.建立UDP 的 Socket 服务。 *
* 2.创建数据包用来接受数据 * 拆包
* 3.将接收到的数据存储到数据包中 *
* 4.解析数据包中的数据。 *
****************************************/
/*
public static void main(String[] args) throws IOException {
//1.创建接收端,明确监听端口
DatagramSocket ds = new DatagramSocket(12345);
//2.1数据包缓冲区数组
byte[] buf = new byte[1024];
//2.2创建数据包,这时后数据包是空的
DatagramPacket dp = new DatagramPacket(buf, buf.length);
while(true){
//3.接收数据并存储在数据包中,数据包中有了数据
ds.receive(dp);//阻塞式
//4.1 获取发送端的IP地址
String ip = dp.getAddress().getHostAddress();
//4.2获取发送端的端口
int port = dp.getPort();
//4.3获取接收到的缓冲区数组
String data = new String(dp.getData(),0,dp.getLength());
// if(data.equals("886"))
// break;
System.out.println(ip + ":" + port + ":" + data);
}
// ds.close();//遥不可及的代码
}
*/
/****************************************
* 接收端要多线程? *
* 如果接收的数据太大,接收端的数据包缓冲区数组怎么指定 *
****************************************/
/****************************************
* 双线程:UDP聊天程序 *
* 创建一个发送线程,线程任务:发送数据包 *
* 创建一个接收线程,线程任务:解析数据包 *
****************************************/
public static void main(String[] args) throws IOException{
//发送Socket
DatagramSocket send = new DatagramSocket();
//接收Socket
DatagramSocket receive = new DatagramSocket(12345);
//发送线程任务
Runnable sendRun = new SendRun(send);
//接收线程任务
Runnable receiveRun = new ReceiveRun(receive);
//开启发送线程
new Thread(sendRun).start();
//开启接收线程
new Thread(receiveRun).start();
}
}
package mynet;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendRun implements Runnable {
private DatagramSocket ds;
public SendRun(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
// 创建读取键盘的流对象。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
// 每次读取一行
String line = null;
// 循环读取,循环发送。
try{
while (true) {
line = bufr.readLine();// 阻塞式
byte[] buf = line.getBytes();
// 将键盘读取到的数据封装到数据包中,并指定接收端地址,和端口。
DatagramPacket dp = //255广播
new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.255"), 12345);
// 发送数据包
ds.send(dp);
// 如果发送888。。。再见、、、
if (line.equals("886"))
break;
}
// 关闭端点
ds.close();
}catch(Exception e){}
}
}
package mynet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveRun implements Runnable {
private DatagramSocket ds;
public ReceiveRun(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
// 2.1创建数据包缓冲区数组
byte[] buf = new byte[1024];
// 2.2创建数据包,这时数据包是空的
DatagramPacket dp = new DatagramPacket(buf, buf.length);
while (true) {
// 3.接收数据并存储在数据包中,数据包中有了数据
try {
ds.receive(dp);// 阻塞式
} catch (IOException e) {}
// 4.1 获取发送端的IP地址
String ip = dp.getAddress().getHostAddress();
// 4.3获取接收到的缓冲区数组
String data = new String(dp.getData(), 0, dp.getLength());
if(data.equals("886")){
System.out.println(ip + "退出聊天室");
break;
}
System.out.println(ip + "说" + ":" + data);
}
ds.close();
}
}