DatagramPacket 此類表示數據報包。
數據報包用來實現無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。
構造方法
DatagramPacket(byte[] buf, int length, SocketAddress address)
構造數據報包,用來將長度為 length 的包發送到指定主機上的指定端口號。
//一個DatagramPacket對象中包含瞭一個字節數組(用來作為接收或發送數據的緩沖區,其中offset和length都是對這個字節數組的操作),一個遠程計算機的網絡地址和端口號。
//一個DatagramPacket對象可以幹兩件事情:1.作為客戶端向遠程的服務器發送一條數據報(此時,要發送的數據是緩沖區裡的數據)DatagramSocket.send(package); 2.作為服務器接收一條數據報(接收到的數據就放在緩沖區裡)DatagramSocket.recieve(package);
InetAddress getAddress()
返回某臺機器的 IP 地址,此數據報將要發往該機器或者是從該機器接收到的。 //已經定義好的網絡地址和端口號
int getPort()
返回某臺遠程主機的端口號,此數據報將要發往該主機或者是從該主機接收到的。
SocketAddress getSocketAddress()
獲取要將此包發送到的或發出此數據報的遠程主機的 SocketAddress(通常為 IP 地址 + 端口號)。
void setAddress(InetAddress iaddr)
設置要將此數據報發往的那臺機器的 IP 地址。
void setSocketAddress(SocketAddress address)
設置要將此數據報發往的遠程主機的 SocketAddress(通常為 IP 地址 + 端口號)。
//對要發送或接收的緩沖區中的數據的操作
byte[] getData()
返回數據緩沖區。
int getLength()
返回將要發送或接收到的數據的長度。
int getOffset()
返回將要發送或接收到的數據的偏移量。
void setData(byte[] buf)
為此包設置數據緩沖區。
void setData(byte[] buf, int offset, int length)
為此包設置數據緩沖區。
void setLength(int length)
為此包設置長度。
void setPort(int iport)
設置要將此數據報發往的遠程主機上的端口號。
DatagramSocket此類表示用來發送和接收數據報包的套接字。
數據報套接字是包投遞服務的發送或接收點。每個在數據報套接字上發送或接收的包都是單獨編址和路由的。
DatagramSocket可以調用bind()綁定到特定的地址和端口。如果地址為 null,則系統將挑選一個臨時端口和一個有效本地地址來綁定套接字。可以調用connect()連接到遠程特定的地址則,包就隻能從該地址發送或接收。
服務器端:服務器端與客戶端是相對的,其實兩邊實現的功能是一樣的。
Java代碼
package com.sea.server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Server1 {
public Server1() {
while (true) {
try {
DatagramSocket datagramSocket = new DatagramSocket(12345);
byte[] msg = new byte[1000];
DatagramPacket packet1 = new DatagramPacket(msg, msg.length);
// datagramPacket.setAddress(InetAddress.getByName("192.168.0.145"));
// datagramPacket.setPort(12345);
// datagramPacket.setData("nihao,客戶端".getBytes());
datagramSocket.receive(packet1);
System.out.println("自己的地址" + datagramSocket.getLocalAddress()
+ " " + datagramSocket.getLocalPort());
System.out.println("服務器端 : " + new String(packet1.getData()));
System.out.println("客戶端的網絡地址:" + packet1.getAddress());
System.out.println("客戶端的端口號:" + packet1.getPort());
System.out.println("\n\n");
// 返回數據
DatagramPacket packet2 = new DatagramPacket(msg, msg.length);
packet2.setData("數據已收到".getBytes());
packet2.setAddress(packet1.getAddress());
packet2.setPort(packet1.getPort());
datagramSocket.send(packet2);
datagramSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server1();
}
}
客戶端:
Java代碼
package com.sea.client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Client1 {
public Client1() {
try {
DatagramSocket datagramSocket = new DatagramSocket(11111);
byte[] msg = new byte[1000];
DatagramPacket datagramPacket = new DatagramPacket(msg, msg.length);
datagramPacket.setAddress(InetAddress.getByName("192.168.0.145"));
datagramPacket.setPort(12345);
datagramPacket.setData("nihao,客戶端".getBytes());
// 發送數據
datagramSocket.send(datagramPacket);
// 接收數據
datagramPacket = new DatagramPacket(msg, msg.length);
datagramSocket.receive(datagramPacket);
// 取出結果
String result = new String(datagramPacket.getData());
System.out.println("服務器返回的數據 : " + result);
System.out.println(datagramPacket.getAddress());
datagramSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Client1();
}
}
作者“quding0308的博客”