熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java套接字編程(下)

2013-11-15 11:44:12  來源: JSP教程 

  自尋址套接字(Datagram Sockets)
  
  因為使用流套接字的每個連接均要花費一定的時間要減少這種開銷網絡API提供了第二種套接字自尋址套接字(datagram socket)自尋址使用UDP發送尋址信息(從客戶程序到服務程序或從服務程序到客戶程序)不同的是可以通過自尋址套接字發送多IP信息包自尋址信息包含在自尋址包中此外自尋址包又包含在IP包內這就將尋址信息長度限制在字節內顯示了位於IP包內的自尋址包的自尋址信息
  
  與TCP保證信息到達信息目的地的方式不同UDP提供了另外一種方法如果自尋址信息包沒有到達目的地那麼UDP也不會請求發送者重新發送自尋址包這是因為UDP在每一個自尋址包中包含了錯誤檢測信息在每個自尋址包到達目的地之後UDP只進行簡單的錯誤檢查如果檢測失敗UDP將拋棄這個自尋址包也不會從發送者那裡重新請求替代者這與通過郵局發送信件相似發信人在發信之前不需要與收信人建立連接同樣也不能保證信件能到達收信人那裡
  
  自尋址套接字工作包括下面三個類DatagramPacket DatagramSocket和 MulticastSocketDatagramPacket對象描繪了自尋址包的地址信息DatagramSocket表示客戶程序和服務程序自尋址套接字MulticastSocket描繪了能進行多點傳送的自尋址套接字這三個類均位於包內
  
  DatagramPacket類
  
  在使用自尋址包之前你需要首先熟悉DatagramPacket類地址信息和自尋址包以字節數組的方式同時壓縮入這個類創建的對象中
  
  DatagramPacket有數個構造函數即使這些構造函數的形式不同但通常情況下他們都有兩個共同的參數byte [] buffer 和 int lengthbuffer參數包含了一個對保存自尋址數據包信息的字節數組的引用length表示字節數組的長度
  
  最簡單的構造函數是DatagramPacket(byte [] buffer int length)這個構造函數確定了自尋址數據包數組和數組的長度但沒有任何自尋址數據包的地址和端口信息這些信息可以後面通過調用方法setAddress(InetAddress addr)和setPort(int port)添加上下面的代碼示范了這些函數和方法
  
  byte [] buffer = new byte [];
  DatagramPacket dgp = new DatagramPacket (buffer bufferlength);
  InetAddress ia = InetAddressgetByName ();
  dgpsetAddress (ia);
  dgpsetPort (); // Send datagram packet to port
  
  如果你更喜歡在調用構造函數的時候同時包括地址和端口號可以使用DatagramPacket(byte [] buffer int length InetAddress addr int port)函數下面的代碼示范了另外一種選擇
  
  byte [] buffer = new byte [];
  InetAddress ia = InetAddressgetByName ();
  DatagramPacket dgp = new DatagramPacket (buffer bufferlength ia
  );
  
  有時候在創建了DatagramPacket對象後想改變字節數組和他的長度這時可以通過調用setData(byte [] buffer) 和 setLength(int length)方法來實現在任何時候都可以通過調用getData() 來得到字節數組的引用通過調用getLength()來獲得字節數組的長度下面的代碼示范了這些方法
  
  byte [] buffer = new byte [];
  dgpsetData (buffer);
  dgpsetLength (bufferlength);
  
  關於DatagramPacket的更多信息請參考SDK文檔
  DatagramSocket類
  
  DatagramSocket類在客戶端創建自尋址套接字與服務器端進行通信連接並發送和接受自尋址套接字雖然有多個構造函數可供選擇但我發現創建客戶端自尋址套接字最便利的選擇是DatagramSocket()函數而服務器端則是DatagramSocket(int port)函數如果未能創建自尋址套接字或綁定自尋址套接字到本地端口那麼這兩個函數都將拋出一個SocketException對象一旦程序創建了DatagramSocket對象那麼程序分別調用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)來發送和接收自尋址數據包
  
  List顯示的DGSClient源代碼示范了如何創建自尋址套接字以及如何通過套接字處理發送和接收信息
  
  Listing : DGSClientjava
  // DGSClientjava
  
  import javaio*;
  import *;
  
  class DGSClient
  {
   public static void main (String [] args)
   {
  String host = localhost;
  
  // If user specifies a commandline argument that argument
  // represents the host name
   
  if (argslength == )
   host = args [];
  
  DatagramSocket s = null;
  
  try
  {
   // Create a datagram socket bound to an arbitrary port
  
   s = new DatagramSocket ();
  
   // Create a byte array that will hold the data portion of a
   // datagram packets message That message originates as a
   // String object which gets converted to a sequence of
   // bytes when Strings getBytes() method is called The
   // conversion uses the platforms default character set
  
   byte [] buffer;
   buffer = new String (Send me a datagram)getBytes ();
  
   // Convert the name of the host to an InetAddress object
   // That object contains the IP address of the host and is
   // used by DatagramPacket
  
   InetAddress ia = InetAddressgetByName (host);
  
   // Create a DatagramPacket object that encapsulates a
   // reference to the byte array and destination address
   // information The destination address consists of the
   // hosts IP address (as stored in the InetAddress object)
   // and port number the port on which the server
   // program listens
  
   DatagramPacket dgp = new DatagramPacket (buffer
        bufferlength
        ia
        );
  
   // Send the datagram packet over the socket
  
   ssend (dgp);
  
   // Create a byte array to hold the response from the server
   // program
  
   byte [] buffer = new byte [];
  
   // Create a DatagramPacket object that specifies a buffer
   // to hold the server programs response the IP address of
   // the server programs computer and port number
  
   dgp = new DatagramPacket (buffer
      bufferlength
      ia
      );
  
   // Receive a datagram packet over the socket
  
   sreceive (dgp);
  
   // Print the data returned from the server program and stored
   // in the datagram packet
  
   Systemoutprintln (new String (dgpgetData ()));
  
  }
  catch (IOException e)
  {
   Systemoutprintln (etoString ());
  }
  finally
  {
   if (s != null)
    sclose (); 
  }
   }
  } 
  
  DGSClient由創建一個綁定任意本地(客戶端)端口好的DatagramSocket對象開始然後裝入帶有文本信息的數組buffer和描述服務器主機IP地址的InetAddress子類對象的引用接下來DGSClient創建了一個DatagramPacket對象該對象加入了帶文本信息的緩沖器的引用InetAddress子類對象的引用以及服務端口號 DatagramPacket的自尋址數據包通過方法sent()發送給服務器程序於是一個包含服務程序響應的新的DatagramPacket對象被創建receive()得到響應的自尋址數據包然後自尋址數據包的getData()方法返回該自尋址數據包的一個引用最後關閉DatagramSocket
  
  DGSServer服務程序補充了DGSClient的不足List是DGSServer的源代碼
  
  Listing : DGSServerjava
  // DGSServerjava
  
  import javaio*;
  import *;
  
  class DGSServer
  {
   public static void main (String [] args) throws IOException
   {
  Systemoutprintln (Server starting \n);
  
  // Create a datagram socket bound to port Datagram
  // packets sent from client programs arrive at this port
  
  DatagramSocket s = new DatagramSocket ();
  
  // Create a byte array to hold data contents of datagram
  // packet
  
  byte [] data
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19527.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.