Java 網絡編程(六) 使用無連接的數據報(UDP)進行通信


 

  使用無連接的數據報(UDP)進行通信

什么是Datagram?

  數據報是網上傳輸的獨立數據包,數據報是否能正確地到達目的地,到達的時間,順序,內容的正確性均沒有保障。

 

  Java中使用DatagramDatagramPacket類。

  DatagramSocket類利用UDP協議來實現客戶與服務器的Socket。

  

  send()發送數據報。

  receive()接收數據報。

  

 

  可以用寫信寄信的例子來類比UDP通信。

  此時DatagramPacket就相當於一個包裝了信封的信件。填好地址和接收人之后,就可以寄出去。

 

簡單的UDP通訊實例

 

UdpUnit1
package com.example.network;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpUnit1
{
    public static void main(String[] args) throws Exception
    {
        DatagramSocket datagramSocket = new DatagramSocket();

        // 構造數據報的包
        String str = "Hello World";

        // 用了public DatagramPacket(byte buf[], int length,InetAddress address,
        // int port)形式
        DatagramPacket packet = new DatagramPacket(str.getBytes(),
                str.length(), InetAddress.getByName("localhost"), 7000);

        // 發送數據包
        datagramSocket.send(packet);

        // 接收數據包
        byte[] buffer = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(buffer, 100);
        datagramSocket.receive(packet2);
        // 輸出接收到的數據
        System.out.println(new String(buffer, 0, packet2.getLength()));

        datagramSocket.close();

    }

}
UdpUnit2
package com.example.network;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpUnit2
{
    public static void main(String[] args) throws Exception
    {
        DatagramSocket socket = new DatagramSocket(7000);

        // 收信息
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 1024);

        // 接收
        socket.receive(packet);
        // 輸出
        System.out.println(new String(buffer, 0, packet.getLength()));

        // 返回信息
        String str = "Welcome!";
        DatagramPacket packet2 = new DatagramPacket(str.getBytes(),
                str.length(), packet.getAddress(), packet.getPort());// 這里填入發送方的信息

        socket.send(packet2);

        socket.close();
    }

}

 

  運行時首先運行UdpUnit2,因為它開始時是在等待接收;然后運行UdpUnit1,它向UdpUnit2發送了“Hello World”的信息,UdpUnit2接收到信息后,返回“Welcome!”。

  比較奇怪的一個地方就是Welcome后的感嘆號在UdpUnit1接收到並輸出后顯示的是問號。

  原因不詳,(難道這就是說明UDP傳輸數據不可靠的證據?)望達人指點。

 

參考資料

  聖思園張龍老師Java SE系列視頻教程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM