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();
}
}