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

瘋狂Java講義:使用Socket進行通信[2]

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

  程序清單codes///Clientjava

  public class Client

  {

  public static void main(String[] args)

  throws IOException

  {

  Socket socket = new Socket(

  //將Socket對應的輸入流包裝成BufferedReader

  BufferedReader br = new BufferedReader(

  new InputStreamReader(socketgetInputStream()))

  //進行普通IO操作

  String line = brreadLine()

  Systemoutprintln(來自服務器的數據 + line)

  //關閉輸入流socket

  brclose()

  socketclose()

  }

  }

  上面程序中粗體字代碼是使用ServerSocket和Socket建立網絡連接的代碼斜體字代碼是通過Socket獲取輸入流輸出流進行通信的代碼通過程序不難看出一旦使用ServerSocketSocket建立網絡連接之後程序通過網絡通信與普通IO並沒有太大的區別

  先運行上面程序中的Server類將看到服務器一直處於等待狀態因為服務器使用了死循環來接受來自客戶端的請求再運行Client類將可看到程序輸出來自服務器的數據您好您收到了服務器的新年祝福!這表明客戶端和服務器端通信成功

  上面程序為了突出通過ServerSocket和Socket建立連接並通過底層IO流進行通信的主題程序沒有進行異常處理也沒有使用finally塊來關閉資源

  實際應用中程序可能不想讓執行網絡連接讀取服務器數據的進程一直阻塞而是希望當網絡連接讀取操作超過合理時間之後系統自動認為該操作失敗這個合理時間就是超時時長Socket對象提供了一個setSoTimeout(int timeout)來設置超時時長如下的代碼片段所示

  Socket s = new Socket(

  //設置秒之後即認為超時

  ssetSoTimeout(

  當我們為Socket對象指定了超時時長之後如果在使用Socket進行讀寫操作完成之前已經超出了該時間限制那麼這些方法就會拋出SocketTimeoutException異常程序可以對該異常進行捕捉並進行適當處理如下代碼所示

  try

  {

  //使用Scanner來讀取網絡輸入流中的數據

  Scanner scan = new Scanner(sgetInputStream())

  //讀取一行字符

  String line = scannextLine()

  …

  }

  //捕捉SocketTimeoutException異常

  catch(SocketTimeoutException ex)

  {

  //對異常進行處理

  …

  }

  假設程序需要為Socket連接服務器時指定超時時長即經過指定時間後如果該Socket還未連接到遠程服務器則系統認為該Socket連接超時但Socket的所有構造器裡都沒有提供指定超時時長的參數所以程序應該先創建一個無連接的Socket再調用Socket的connect()方法來連接遠程服務器而connect方法就可以接受一個超時時長參數如下代碼所示

  //創建一個無連接的Socket

  Socket s = new Socket()

  //讓該Socket連接到遠程服務器如果經過秒還沒有連接到則認為連接超時

  sconnconnect(new InetAddress(host port)

       返回目錄瘋狂Java講義

       編輯推薦

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

       新手學Java 編程

       Java程序設計培訓視頻教程

[]  []  


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