基于Java的UDP協議程序設計初探
在Java中進行網絡編程是相對容易的,因為J2SE中的java.net包已經對各種通信協議很好的進行了封裝,本文主要講述如何基于UDP(用戶數據報)協議編寫應用程序。
通常我們進行網絡編程一般都是使用基于socket的TCP/IP編程,畢竟TCP/IP應用非常的廣泛,比如我們瀏覽互聯網就是基于HTTP協議、我們發送郵件是通過SMTP協議。它們都是基于TCP/IP的。TCP/IP的傳輸最重要的是它可以保證數據到達目的地,而UDP則不同他并不保證準確的傳輸,數據有可能丟失。如果有興趣的話,讀者可以參考《計算機網絡》一書。
在介紹UDP編程之前有必要介紹一個重要的類InetAddress,用最簡單的一句話描述這個類的作用就是:它代表了一個IP地址。這非常重要在互聯網中如果知道了IP地址則意味著我們知道了通信的端點。這個類沒有構造器但是有幾個工廠方法,通過傳遞不同的參數例如IP,Hostname等來得到一個InetAddress的實例,下面的這個小例子可以得到我機器的IP地址。
當然我的機器的名字為compaq,如果你傳入localhost的話將會得到127.0.0.1。
接下來開始講述如何使用UDP編程,這非常容易理解,我們應該首先構造一個數據報,然后把它發送出去,同時我們也可以接收數據報。在java中提供了DatagramPacket和DatagramSocket兩個類來完成這樣的任務,前者負責構造數據報后者負責發送和接收。看看DatagramPacket的構造器
其中前面四個是為構造發送的數據報而用的,因為他們有InetAddress或者SocketInetAddress作為接收端點的地址,后面一個則是為了接受數據報用的。
同樣我們編寫一個C/S模型的例子來說明如何使用這兩個重要的類,如果對API還不熟悉請參考Java doc。下面的程序在本機構造一個時間服務器,客戶端來取得時間。以前曾經寫過類似的時間服務器程序,不過這個是基于UDP的編程。
在介紹UDP編程之前有必要介紹一個重要的類InetAddress,用最簡單的一句話描述這個類的作用就是:它代表了一個IP地址。這非常重要在互聯網中如果知道了IP地址則意味著我們知道了通信的端點。這個類沒有構造器但是有幾個工廠方法,通過傳遞不同的參數例如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(); } } |