老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Java中怎么實現BIO阻塞式網絡編程

這篇文章將為大家詳細講解有關Java中怎么實現BIO阻塞式網絡編程,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

創新互聯是專業的向陽網站建設公司,向陽接單;提供成都網站制作、成都做網站,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行向陽網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!

阻塞IO的含義

阻塞(blocking)IO:阻塞是指結果返回之前,線程會被掛起,函數只有在得到結果之后(或超時)才會返回

非阻塞(non-blocking)IO:非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回

同步(synchronous)IO:應用阻塞在發送或接受數據的狀態,直至數據成功傳輸(或返回失敗),簡單來說就是必須一件一件事做,等前一件做完了才能做下一件事

異步(asynchronous)IO:應用發送或接受數據后立即返回,實際處理這個調用的程序在完成后,通過狀態、通知和回調來通知調用者

阻塞和非阻塞是獲取資源的方式,同步和異步是程序如何處理資源的邏輯。

BIO網絡編程

首先我們來看一段最基礎的Java網絡編程代碼示例:

服務器端代碼示例:

public class BIOServerV1 {
  public static void main(String[] args) throws Exception {
    ServerSocket serverSocket = new ServerSocket(8080);
    System.out.println("服務器啟動成功");
    while (!serverSocket.isClosed()) {

      Socket request = serverSocket.accept(); // 阻塞

      System.out.println("收到新連接:" + request.toString());

      try {
        InputStream inputStream = request.getInputStream(); // 獲取數據流        BufferedReader bufferedReader =
            new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
        String message;
        while ((message = bufferedReader.readLine()) != null) {
          if (message.length() == 0) {
            break;
          }
          System.out.println("消息內容為:" + message);
        }
        System.out.println("收到數據,來自:" + request.toString());
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
        request.close();
      }
    }
    serverSocket.close();
  }
}

客戶端代碼示例:

public class BIOClient {
  public static void main(String[] args) throws IOException {
    Socket socket = new Socket("localhost", 8080);
    OutputStream outputStream = socket.getOutputStream();
    Scanner scanner = new Scanner(System.in);
    System.out.println("請輸入:");
    String message = scanner.nextLine();
    outputStream.write(message.getBytes(Charset.forName("UTF-8")));
    scanner.close();
    socket.close();
  }
}

這個版本服務器端的代碼同一時刻只能支持一個網絡連接,在建立連接之后服務端線程會被阻塞,只有在已建立連接的客戶端處理完數據關閉連接之后,后續的連接請求才能一個一個的處理,而為了能并發的處理多個請求我們在下一個版本中加入多線程的代碼。

public class BIOServerV2 {
  private static ExecutorService executorService = Executors.newCachedThreadPool();
  public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket(8080);
    System.out.println("服務器啟動成功");
    while (!serverSocket.isClosed()) {
      Socket request = serverSocket.accept();
      System.out.println("收到新連接:" + request.toString());

      // 多線程接收多個連接
      executorService.submit(
          () -> {
            try {
              InputStream inputStream = request.getInputStream();
              BufferedReader bufferedReader =
                  new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
              String message;
              while ((message = bufferedReader.readLine()) != null) {
                if (message.length() == 0) {
                  break;
                }
                System.out.println("消息內容為:" + message);
              }
              System.out.println("收到數據,來自:" + request.toString());
            } catch (IOException e) {
              e.printStackTrace();
            } finally {
              try {
                request.close();
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          });
    }
    serverSocket.close();
  }
}

這個版本的代碼在加入多線程后可以并發的處理多個連接,但是它只能處理Java客戶端的連接不能處理瀏覽器端的連接,而為了能與瀏覽器端交互我們需要了解HTTP協議的內容。

HTTP協議

HTTP協議請求數據包解析

Java中怎么實現BIO阻塞式網絡編程

HTTP協議響應數據包解析

Java中怎么實現BIO阻塞式網絡編程

HTTP協議響應狀態碼:

Java中怎么實現BIO阻塞式網絡編程

BIO網絡編程處理瀏覽器請求

在了解了HTTP協議的內容之后我們就可以依據HTTP協議的內容編寫程序來處理瀏覽器請求。在之前多線程版本的代碼之上我們需要對數據根據HTTP協議的內容進行處理,代碼示例如下:

public class BIOServerV3 {
  private static ExecutorService executorService = Executors.newCachedThreadPool();
  public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket(8080);
    System.out.println("服務器啟動成功");
    while (!serverSocket.isClosed()) {
      Socket request = serverSocket.accept();
      System.out.println("收到新連接:" + request.toString());

      // 多線程接收多個連接
      executorService.submit(
          () -> {
            try {
              InputStream inputStream = request.getInputStream();
              BufferedReader bufferedReader =
                  new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
              String message;
              while ((message = bufferedReader.readLine()) != null) {
                if (message.length() == 0) {
                  break;
                }

                // 拿到消息后可以解析消息拿到請求方法,請求數據等內容
                System.out.println("消息內容為:" + message);

              }
              System.out.println("收到數據,來自:" + request.toString());

              // 根據HTTP協議響應數據包返回數據給瀏覽器
              OutputStream outputStream = request.getOutputStream();
              outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
              outputStream.write("Content-Length: 11\r\n\r\n".getBytes());
              outputStream.write("Hello World".getBytes());
              outputStream.flush();
            } catch (IOException e) {
              e.printStackTrace();
            } finally {
              try {
                request.close();
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          });
    }
    serverSocket.close();
  }
}

關于Java中怎么實現BIO阻塞式網絡編程就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


名稱欄目:Java中怎么實現BIO阻塞式網絡編程
本文來源:http://www.xueling.net.cn/article/gscccp.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 日本成人综合 | 国产亲子私乱av | 国产精品乱码久久久久 | 羞羞视频一区 | 人人狠狠综合久久88成人 | 91麻豆国产福利在线观看宅福利 | 国产一级淫片在线观看 | 久久久妇女 | 精品国产日韩欧美一区二区 | 青青草午夜色影院 | 麻豆国产VA免费精品高清在线 | 九一国产精品视频 | 日本成人在线免费视频 | 老司机在线精品视频 | 五月激情网站 | 国产免费视频一区二区三区 | 天天操天天骑 | 欧美国产日韩一区 | 终极斗罗4第三季免费播放 免费无码成人片 | 亚洲欧美综合久久久久久 | 怡春院性无码免费视频 | 蜜臀亚洲av永久无码精品老司机 | 少妇翘臀亚洲精品av图片 | 色婷婷久久综合中文久久 | 麻豆视频在线观看免费网站黄 | 国产白嫩精品又爽又深呻吟 | 久久久久久久久久一区 | 国产精品视频xxx | 成年人免费小视频 | 国产在线精品一区二区 | 亚洲国产va精品久久久不卡综合 | 亚洲av日韩av天堂影片精品 | 日韩在线观看视频一区 | 国产亚洲AV片在线观看16女人 | 变态孕交videosgratis孕妇 | 天天操夜夜操狠狠操 | 97人人做人人爱 | 中文天堂在线WWW最新版官网 | 无码免费H成年动漫在线观看网站 | 免费女人18毛片a毛片视频 | 久久精品成人热国产成 |