熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

瘋狂Java講義:使用DatagramSocket發送、接收數據[2]

2013-11-23 19:39:45  來源: Java核心技術 

  程序客戶端代碼也與此類似客戶端采用循環不斷地讀取用戶鍵盤輸入每當讀到用戶輸入內容後就將該內容封裝成DatagramPacket數據報再將該數據報發送出去接著把DatagramSocket中的數據讀入接收用的DatagramPacket中(實際上是讀入該DatagramPacket所封裝的字節數組中)客戶端代碼如下

  程序清單codes///UdpClientjava

  public class UdpClient

  {

  //定義發送數據報的目的地

  public static final int DEST_PORT = ;

  public static final String DEST_IP = ;

  //定義每個數據報的最大大小為K

  private static final int DATA_LEN = ;

  //定義該客戶端使用的DatagramSocket

  private DatagramSocket socket = null;

  //定義接收網絡數據的字節數組

  byte[] inBuff = new byte[DATA_LEN];

  //以指定字節數組創建准備接受數據的DatagramPacket對象

  private DatagramPacket inPacket =

  new DatagramPacket(inBuff inBufflength)

  //定義一個用於發送的DatagramPacket對象

  private DatagramPacket outPacket = null;

  public void init()throws IOException

  {

  try

  {

  //創建一個客戶端DatagramSocket使用隨機端口

  socket = new DatagramSocket()

  //初始化發送用的DatagramSocket它包含一個長度為的字節數組

  outPacket = new DatagramPacket(new byte[]

  InetAddressgetByName(DEST_IP) DEST_PORT)

  //創建鍵盤輸入流

  Scanner scan = new Scanner(Systemin)

  //不斷讀取鍵盤輸入

  while(scanhasNextLine())

  {

  //將鍵盤輸入的一行字符串轉換字節數組

  byte[] buff = scannextLine()getBytes()

  //設置發送用的DatagramPacket裡的字節數據

  outPacketsetData(buff)

  //發送數據報

  socketsend(outPacket)

  //讀取Socket中的數據讀到的數據放在inPacket所封裝的字節數組裡

  socketreceive(inPacket)

  Systemoutprintln(new String(inBuff

  inPacketgetLength()))

  }

  }

  //使用finally塊保證關閉資源

  finally

  {

  if (socket != null)

  {

  socketclose()

  }

  }

  }

  public static void main(String[] args)

  throws IOException

  {

  new UdpClient()init()

  }

  }

  上面程序的粗體字代碼同樣也是通過DatagramSocket發送接收DatagramPacket的關鍵代碼這些代碼與服務器的代碼基本相似而客戶端與服務器端的唯一區別在於服務器所在IP地址端口是固定的所以客戶端可以直接將該數據報發送給服務器而服務器則需要根據接收到的數據報來決定將反饋數據報的目的地

  讀者可能會發現使用DatagramSocket進行網絡通信時服務器端無須也無法保存每個客戶端的狀態客戶端把數據報發送到服務器後完全有可能立即退出但不管客戶端是否退出服務器無法知道客戶端的狀態

  當使用UDP協議時如果想讓一個客戶端發送的聊天信息可被轉發到其他所有客戶端則比較困難可以考慮在服務器使用Set來保存所有客戶端信息每當接收到一個客戶端的數據報之後程序檢查該數據報的源SocketAddress是否在Set集合中如果不在就將該SocketAddress添加到該Set集合中但這樣一來又涉及一個問題可能有些客戶端發送一個數據報之後永久性地退出了程序但服務器端還將該客戶端的SocketAddress保存在Set集合中……總之這種方式需要處理的問題比較多編程比較煩瑣幸好Java為UDP協議提供了MulticastSocket類通過該類可以輕松實現多點廣播

       返回目錄瘋狂Java講義

       編輯推薦

       Java程序性能優化讓你的Java程序更快更穩定

       新手學Java 編程

       Java程序設計培訓視頻教程

[]  []  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27260.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.