在Java中基於UDP協議編程

來源:互聯網
上載者:User

        在Java中進行網路編程是相對容易的,因為J2SE中的java.net包已經對各種通訊協定很好的進行了封裝,本文主要講述如何基於UDP(使用者資料報)協議編寫應用程式。

        通常我們進行網路編程一般都是使用基於socket的TCP/IP編程,畢竟TCP/IP應用非常的廣泛,比如我們瀏覽互連網就是基於HTTP協議、我們發送郵件是通過SMTP協議。它們都是基於TCP/IP的。TCP/IP的傳輸最重要的是它可以保證資料到達目的地,而UDP則不同他並不保證準確的傳輸,資料有可能丟失。如果有興趣的話,讀者可以參考《電腦網路》一書。

        在介紹UDP編程之前有必要介紹一個重要的類InetAddress,用最簡單的一句話描述這個類的作用就是:它代表了一個IP地址。這非常重要在互連網中如果知道了IP地址則意味著我們知道了通訊的端點。這個類沒有構造器但是有幾個Factory 方法,通過傳遞不同的參數例如IP,Hostname等來得到一個InetAddress的執行個體,下面的這個小例子可以得到我機器的IP地址。
import java.net.*;

public class TestNet
{
 public static void main(String[] args) throws Exception
 {
  InetAddress ia = InetAddress.getByName("compaq");
  String ipAdr = ia.getHostAddress();
  System.out.println(ipAdr);
 }
}
當然我的機器的名字為compaq,如果你傳入localhost的話將會得到127.0.0.1。

        接下來開始講述如何使用UDP編程,這非常容易理解,我們應該首先構造一個資料報,然後把它發送出去,同時我們也可以接收資料報。在java中提供了DatagramPacket和DatagramSocket兩個類來完成這樣的任務,前者負責構造資料報後者負責發送和接收。看看DatagramPacket的構造器
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
DatagramPacket(byte[] buf, int length, SocketAddress address)
DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int offset, int length)
其中前面四個是為構造發送的資料報而用的,因為他們有InetAddress或者SocketInetAddress作為接收端點的地址,後面一個則是為了接受資料報用的。

    同樣我們編寫一個C/S模型的例子來說明如何使用這兩個重要的類,如果對API還不熟悉請參考Java doc。下面的程式在本機構造一個時間伺服器,用戶端來取得時間。以前曾經寫過類似的時間伺服器程式,不過這個是基於UDP的編程。
   import java.io.*;
   import java.net.*;
   import java.util.*;

   public class TimeServer {
     final private static int DAYTIME_PORT = 13;
     public static void main(String args[]) throws
             IOException {
       DatagramSocket socket =
             new DatagramSocket(DAYTIME_PORT);
       while (true) {
         byte buffer[] = new byte[256];
         DatagramPacket packet =
             new DatagramPacket(buffer, buffer.length);
         socket.receive(packet);
         String date = new Date().toString();
         buffer = date.getBytes();
         // Get response address/port
         // for client from packet
         InetAddress address = packet.getAddress();
         int port = packet.getPort();
         packet = new DatagramPacket(buffer, buffer.length,
                 address, port);
         socket.send(packet);
       }
     }
   }

   import java.io.*;
   import java.net.*;

   public class GetTime {
     final private static int DAYTIME_PORT = 13;
     public static void main(String args[]) throws
             IOException {
       if (args.length == 0) {
         System.err.println
             ("Please specify daytime host");
         System.exit(-1);
       }
       String host = args[0];
       byte message[] = new byte[256];
       InetAddress address = InetAddress.getByName(host);
       System.out.println("Checking at: " + address);
       DatagramPacket packet =
           new DatagramPacket(message, message.length,
                   address, DAYTIME_PORT);
       DatagramSocket socket = new DatagramSocket();
       socket.send(packet);
       packet =
           new DatagramPacket(message, message.length);
       socket.receive(packet);
       String time = new String(packet.getData());
       System.out.println(The time at "
               + host + " is: " + time);
       socket.close();
     }
   }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.