UDP網絡連接操作 – Android移動開發技術文章_手機開發 Android移動開發教學課程

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的博客”
 

發佈留言