<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 介紹 ![](https://img.kancloud.cn/37/14/3714356aa8b6fe52b25d0da61f8d9108_670x239.png) ### 同步IO之BlockingIO ![](https://box.kancloud.cn/56ff8ce655e799951d2d88150283f200_552x331.png) 如上圖所示,用戶進程process在Blocking IO讀recvfrom操作的兩個階段都是等待的。在數據沒準備好的時候,process原地等待kernel準備數據。kernel準備好數據后,process繼續等待kernel將數據copy到自己的buffer。在kernel完成數據的copy后process才會從recvfrom系統調用中返回 ### 同步阻塞式I/O ``` public class SocketServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8999); while (true) { Socket socket = server.accept(); new Thread(new ChannelSocker(socket)).start(); } } static class ChannelSocker implements Runnable { private Socket socket; public ChannelSocker(Socket socket) { this.socket = socket; } @Override public void run() { StringBuffer res = new StringBuffer(); try (InputStream inputStream = socket.getInputStream(); InputStreamReader reader = new InputStreamReader(inputStream); BufferedReader read = new BufferedReader(reader);) { String line = read.readLine(); while (line != null) { res.append(line); line = read.readLine(); } } catch (IOException e) { e.printStackTrace(); } finally { System.err.println("接收到消息" + res.toString()); } } } } ``` 阻塞型I/O,主要阻塞在兩個地方: 1. 在調用InutStream.read方法是阻塞的,它會一直等到數據到來時(或超時)才會返回; 2. 在調用ServerSocket.accept方法時,也會一直阻塞到有客戶端連接才會返回; ### setSoTimeout serverSocket.setSoTimeout\(3000\); \#\# soTimeout將accept阻塞3秒 Socket socket = serverSocket.accept\(\); ``` try (ServerSocket serverSocket = new ServerSocket(8089)){ serverSocket.setSoTimeout(3000); Socket socket = serverSocket.accept(); System.err.println("finished"); } catch (Exception e) { e.printStackTrace(); } System.err.println("end==>"); ``` ### SO\_RCVBUF SO\_RCVBUF選項設置了服務器Socket接受的客戶端Socket默認緩沖區大小 ``` try (ServerSocket serverSocket = new ServerSocket(8089)){ serverSocket.setSoTimeout(3000); serverSocket.setReceiveBufferSize(1024); Socket socket = serverSocket.accept(); System.err.println("finished"); } catch (Exception e) { e.printStackTrace(); } System.err.println("end==>"); ``` ### 阻塞模型 ![](https://img.kancloud.cn/ca/11/ca115d9a44177fe9bf1559e1415ef735_700x295.png) ### 阻塞型的I/O存在的問題 InputStream.read\(\)方法在其緩存區未滿時會造成阻塞,只有數據填滿了緩存區或者客戶端關閉了套接字,方法才會返回; BufferedReader創建了緩存區來從套接字中讀入數據,但是同樣創建了一些字符串存儲這些數據,這些String很快變成垃圾需要回收; InputStream 中的read方法用于讀取數據,方法有3個重載: * read\(\):從輸入流讀取下一個數據字節; * read\(byte\[\] b\):從輸入流中讀取一定數量的字節并將其存儲在緩沖區數組b中; * read\(byte\[\] b, int off, int len\):將輸入流中最多 len 個數據字節讀入字節數組;
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看