最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java進階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程

 更新時間:2006年12月23日 00:00:00   作者:  
文章來源:csdn 作者:DaiJiaLin

  Java的Socket API提供了一個很方便的對象接口進行網(wǎng)絡(luò)編程。本文用一個簡單的TCP Echo Server做例子,演示了如何使用Java完成一個網(wǎng)絡(luò)服務(wù)器。

   用作例子的TCP Echo Server是按以下方式工作的:

  當一個客戶端通過TCP連接到服務(wù)器后,客戶端可以通過這個連接發(fā)送數(shù)據(jù)到服務(wù)端,而服務(wù)端接收到數(shù)據(jù)后會把這些數(shù)據(jù)用同一個TCP連接發(fā)送回客戶端。服務(wù)端會一直保持這個連接直到客戶端關(guān)閉它為止。

  因為服務(wù)器需要能同時處理多個客戶端,我們先選用一個常見的多線程服務(wù)模型:

  讓一個Thread負責(zé)監(jiān)聽服務(wù)端口,當有新的連接建立的時候,這個監(jiān)聽的Thread會為這個連接創(chuàng)建一個新的Thread來處理它。這樣,服務(wù)器可以接受多個連接,并讓多個Thread來分別處理它們。

  以下是相應(yīng)的服務(wù)端程序:


  public class EchoServer implements Runnable {

  public void run() {

  try {

  ServerSocket svr = new ServerSocket(7);

  while (true) {

  Socket sock = svr.accept();

  new Thread(new EchoSession(sock)).start();

  }

  } catch (IOException ex) {

  throw new ExceptionAdapter(ex);

  }

  }

  }

  這段代碼先創(chuàng)建了一個ServerSocket的對象并讓其監(jiān)聽在TCP端口7上,然后在一個循環(huán)中用accept()方法接收新的連接,并創(chuàng)建處理這一連接的Thread。實際處理每個客戶端連接的邏輯包含在EchoSession這個類里面。

  在以上代碼中使用了ExceptionAdapter這個類,它的作用是把一個checked Exception包裝成RuntimeException。詳細的說明可以參考避免在Java中使用Checked Exception 一文。

  以下是EchoSession的代碼:


  public class EchoSession implements Runnable {

  public EchoSession(Socket s) {

  _sock = s;

  }

  public void run() {


  try {

  try {

  InputStream input = _sock.getInputStream();

  OutputStream output = _sock.getOutputStream();

  byte [] buf = new byte [128];            

  while (true) {

  int count = input.read(buf);

  if (count == -1)

  break;

  output.write(buf, 0 , count);

  }

  } finally {

  _sock.close();

  }

  } catch (IOException ex) {

  throw new ExceptionAdapter(ex);   

  }

  }

  protected Socket _sock = null;

  }

  EchoSession接受一個Socket對象作為構(gòu)造參數(shù),在其run()方法中,它不停的從這個Socket對象的InputStream里面讀數(shù)據(jù)并寫回到該Socket的OutputStream中去,直到這個連接被客戶端關(guān)閉為止(InputStream的read方法返回-1)。

  EchoSession需要一個線程來執(zhí)行,這容易讓人聯(lián)想到用Thread來作為EchoSession的父類。不過,這樣做不夠靈活,開銷也比較大。而選擇讓EchoSession實現(xiàn)Runnable接口就靈活得多。在接下來的使用Thread Pool的Echo Server中可以看到這一點。

  以上已經(jīng)是一個完整的TCP Echo Server,不過隨著客戶不停的連接和斷開,這個服務(wù)器會不停的產(chǎn)生和消除線程,而這兩個都是比較‘昂貴'的操作。為了避免這種消耗,可以考慮采用Thread Pool的機制。

  使用在一個簡單的Thread緩沖池的實現(xiàn)一文中Thread Pool的實現(xiàn),可以對EchoServer作如下修改(EchoSession無需做修改):


  public class EchoServer implements Runnable {

  public void run() {

  try {

  ServerSocket svr = new ServerSocket(7);

 


  // 初始化Thread Pool

  SyncQueue queue = new SyncQueue(10);

  for (int i = 0; i < 10; i ++) {

  new Thread(new Worker(queue)).start();

  }

  while (true) {

  Socket sock = svr.accept();

  // 把任務(wù)放入Thread Pool

  queue.put(new EchoSession(sock));

  }

  } catch (IOException ex) {

  throw new ExceptionAdapter(ex);

  }

  }

  }

  這里可以看出讓EchoSession實現(xiàn)Runnable接口的靈活性,無需修改它就可以在Thread Pool里使用。

  在這個例子里使用的Thread Pool比較簡單,沒有動態(tài)調(diào)整Thread數(shù)量的功能,所以這個Echo Server最多只能同時服務(wù)10個客戶端。然而通過重載SyncQueue,我們可以很方便地加入這個功能以突破這個限制。

  在對網(wǎng)絡(luò)服務(wù)器的性能以及并發(fā)度要求很高的時候,讓每個客戶端由一個專門的Thread來處理有可能不能滿足我們的要求(想象一下同時有數(shù)千個客戶端的情況)。這時可以考慮使用Java的NIO API來構(gòu)建服務(wù)器架構(gòu),因為NIO中IO操作都是非阻塞的,我們只需要很少的Thread就可以充分地利用CPU來處理多個客戶端的請求。關(guān)于NIO的話題,在這篇文章就不再贅述,希望以后能有機會討論。 :)

相關(guān)文章

  • 動力節(jié)點_王勇_DRP項目視頻教程完整版292集

    動力節(jié)點_王勇_DRP項目視頻教程完整版292集

    該視頻由國內(nèi)知名講師王勇老師主講,適合掌握Java基礎(chǔ)內(nèi)容的同學(xué)學(xué)習(xí),本視頻共計292集,學(xué)習(xí)Java Web項目,DRP項目視頻是首選,累計下載量已經(jīng)達到上千萬,很多同學(xué)通過自學(xué)該視頻找到了軟件開發(fā)工作
    2017-04-04
  • Java判斷是否為簡體中文字符的實現(xiàn)方法

    Java判斷是否為簡體中文字符的實現(xiàn)方法

    在應(yīng)用開發(fā)中,判斷簡體中文字符是一個重要但常被忽視的任務(wù),簡體中文和繁體中文在字符上有顯著的區(qū)別,因此在某些場景下我們需要判斷輸入的文本是否為簡體中文,本文將介紹如何使用Java進行此判斷,并提供相應(yīng)的代碼示例,幫助開發(fā)者更好地理解這一過程
    2024-09-09
  • 超詳細的Java 問題排查工具單

    超詳細的Java 問題排查工具單

    這篇文章主要介紹了超詳細的Java 問題排查工具單,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot如何使用Fastjson解析Json數(shù)據(jù)

    SpringBoot如何使用Fastjson解析Json數(shù)據(jù)

    這篇文章主要介紹了SpringBoot如何使用Fastjson解析Json數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • mybatis-plus配置控制臺打印完整帶參數(shù)SQL語句的實現(xiàn)

    mybatis-plus配置控制臺打印完整帶參數(shù)SQL語句的實現(xiàn)

    這篇文章主要介紹了mybatis-plus配置控制臺打印完整帶參數(shù)SQL語句,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java實現(xiàn)的日期處理類完整實例

    Java實現(xiàn)的日期處理類完整實例

    這篇文章主要介紹了Java實現(xiàn)的日期處理類,結(jié)合完整實例形式分析了Java針對日期的獲取、運算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • 在idea中利用maven實現(xiàn)多環(huán)境配置自動打包的流程步驟

    在idea中利用maven實現(xiàn)多環(huán)境配置自動打包的流程步驟

    這篇文章主要介紹了在idea中利用maven實現(xiàn)多環(huán)境配置自動打包的流程步驟,文中通過圖文和代碼示例介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定幫助,需要的朋友可以參考下
    2024-11-11
  • 基于指針pointers和引用references的區(qū)別分析

    基于指針pointers和引用references的區(qū)別分析

    本篇文章介紹了,基于指針pointers和引用references的區(qū)別分析。需要的朋友參考下
    2013-05-05
  • Java中的LinkedHashSet集合解讀

    Java中的LinkedHashSet集合解讀

    這篇文章主要介紹了Java中的LinkedHashSet集合解讀,LInkedHashSet這個容器不知道大家在平時的工作用的多嗎,反正我基本上沒有用過,所以,本文主要對于它的特點、使用場景、實現(xiàn)原理,做一個講解,希望對大家平時的工作有所幫助,需要的朋友可以參考下
    2023-09-09
  • Java中的Cursor使用詳解

    Java中的Cursor使用詳解

    本文介紹了Java中的Cursor接口及其在大數(shù)據(jù)集處理中的優(yōu)勢,包括逐行讀取、分頁處理、流控制、動態(tài)改變查詢、并發(fā)控制和減少網(wǎng)絡(luò)流量等,感興趣的朋友一起看看吧
    2025-02-02

最新評論

松江区| 固始县| 融水| 江安县| 贵德县| 乐东| 广河县| 鄂托克旗| 禹州市| 万宁市| 江安县| 广元市| 郴州市| 镇远县| 北流市| 岐山县| 雷州市| 台前县| 榆树市| 葵青区| 合山市| 突泉县| 体育| 余庆县| 新密市| 江西省| 精河县| 辉县市| 光山县| 元氏县| 云安县| 湘潭市| 莆田市| 石阡县| 平顺县| 成武县| 长武县| 进贤县| 雅安市| 莫力| 长宁区|