上一篇文章 網路程式設計(上)我們瞭解了 網路程式設計之三要素 和Socket 通訊原理 此篇文章我們將學習 UDP傳輸與最佳化
沒看過的朋友最好看下
網路程式設計(上) 加深理解 畢竟基礎知識回憶一下也是好的 在看此文也能更加透徹的理解
網路程式設計 (UDP傳輸)
1.傳送Send
* 建立DatagramSocket, 隨機埠號
* 建立DatagramPacket, 指定資料, 長度, 地址, 埠
* 使用DatagramSocket傳送DatagramPacket
* 關閉DatagramSocket
eclipse 寫兩個main方法 我用的 Aandroid Studio
/**
* * 1.傳送Send
* 建立DatagramSocket, 隨機埠號
* 建立DatagramPacket, 指定資料, 長度, 地址, 埠
* 使用DatagramSocket傳送DatagramPacket
* 關閉DatagramSocket
*/
public static void main(String[] args) throws Exception {
String str = "你好世界";
DatagramSocket socket = new DatagramSocket(); //建立Socket相當於建立碼頭
DatagramPacket packet = //建立Packet相當於集裝箱(資料)
new DatagramPacket(str.getBytes(), str.getBytes().length,
InetAddress.getByName("127.0.0.1"), 9999);
socket.send(packet); //發貨,將資料發出去
socket.close(); //關閉碼頭 底層實現IO流 所以必須要關閉
}
2.接收Receive
* 建立DatagramSocket, 指定埠號
* 建立DatagramPacket, 指定陣列, 長度
* 使用DatagramSocket接收DatagramPacket
* 關閉DatagramSocket
* 從DatagramPacket中獲取資料
* 3.接收方獲取ip和埠號
* String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort();
/**
** 2.接收
* 建立DatagramSocket, 指定埠號
* 建立DatagramPacket, 指定陣列, 長度
* 使用DatagramSocket接收DatagramPacket
* 關閉DatagramSocket
* 從DatagramPacket中獲取資料
*/
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9999); //建立Socket相當於建立碼頭 指定埠號9999
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//建立Packet相當於建立集裝箱
socket.receive(packet); //接貨,接收資料
byte[] arr = packet.getData(); //獲取全部的資料 有些為空
int len = packet.getLength(); //獲取有效的位元組個數
System.out.println(new String(arr,0,len)); // 列印 接收到的資料
socket.close(); // 關流
}
注意啟動的時候要
先啟動服務端 在啟動傳送端
網路程式設計(UDP 傳輸最佳化)
上面的程式碼看起有點簡陋 要一句一句傳送 我們來做個最佳化 以鍵盤錄入的形式
傳送端
/**
* * 1.傳送Send
* 建立DatagramSocket, 隨機埠號
* 建立DatagramPacket, 指定資料, 長度, 地址, 埠
* 使用DatagramSocket傳送DatagramPacket
* 關閉DatagramSocket
*/
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in); //建立鍵盤錄入物件
DatagramSocket socket = new DatagramSocket(); //建立Socket相當於建立碼頭
while(true) {
String line = sc.nextLine(); //獲取鍵盤錄入的字串
if("quit".equals(line)) {
break;
}
DatagramPacket packet = //建立Packet相當於集裝箱
new DatagramPacket(line.getBytes(), line.getBytes().length,
InetAddress.getByName("127.0.0.1"), 9999);
socket.send(packet); //發貨,將資料(資料)發出去
}
socket.close(); //關閉碼頭
}
接收端
接收端
/**
** 2.接收Receive
* 建立DatagramSocket, 指定埠號
* 建立DatagramPacket, 指定陣列, 長度
* 使用DatagramSocket接收DatagramPacket
* 關閉DatagramSocket
* 從DatagramPacket中獲取資料
*/
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9999); //建立Socket相當於建立碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//建立Packet相當於建立集裝箱
while(true) {
socket.receive(packet); //接貨,接收資料
byte[] arr = packet.getData(); //獲取資料
int len = packet.getLength(); //獲取有效的位元組個數
String ip = packet.getAddress().getHostAddress();//獲取ip地址
int port = packet.getPort(); //獲取埠號
System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); //為了看起來明顯點 加上ip地址和埠號
}
}
傳送資訊
接收到的資料
看起來是不是還不錯 可以一直做傳送操作 但必須開兩個視窗 很麻煩 我們接著使用多執行緒來做最佳化
網路程式設計(UDP傳輸 多執行緒最佳化)
接受與傳送在同一個視窗完成
/**
* @param args
*/
public static void main(String[] args) throws InterruptedException {
new Receive().start();
// 可以做個睡眠操作 如果你怕 傳送先開啟的話
new Send().start();
}
}
class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(9999); //建立Socket相當於建立碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//建立Packet相當於建立集裝箱
while(true) {
socket.receive(packet); //接貨,接收資料
byte[] arr = packet.getData(); //獲取資料
int len = packet.getLength(); //獲取有效的位元組個數
String ip = packet.getAddress().getHostAddress();//獲取ip地址
int port = packet.getPort(); //獲取埠號
System.out.println(ip + ":" + port + ":" + new String(arr,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Send extends Thread {
public void run() {
try {
Scanner sc = new Scanner(System.in); //建立鍵盤錄入物件
DatagramSocket socket = new DatagramSocket();//建立Socket相當於建立碼頭
while(true) {
String line = sc.nextLine(); //獲取鍵盤錄入的字串
if("quit".equals(line)) {
break;
}
DatagramPacket packet = //建立Packet相當於集裝箱
new DatagramPacket(line.getBytes(), line.getBytes().length,
InetAddress.getByName("127.0.0.1"), 9999);
socket.send(packet); //發貨,將資料發出去
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
這下不是美滋滋 就在一個視窗完成了所有操作
這就是UDP 的核心邏輯了 其實還可以寫GUI(影像化介面)加上 聊天記錄 清屏 震動等功能 但一點用也沒有 沒有價值 學習到了核心邏輯就行了 過幾天我會寫 TCP協議 其實這些都是為了 即時通訊做鋪墊 如果此文幫助到了你希望能給點個贊