Java開發工程師最新面試題庫系列——網絡編程部分(附答案)

網絡編程
  1. 什麼是IO?編程

    答:IO其實就是Input和Output的縮寫,也就是輸入輸出操做。通常軟件系統的 I/O 一般指磁盤和網絡,Java中的IO是以流的形式對字節數據進行操做,輸入流從Java程序中讀取系統數據或網絡傳輸數據到程序內存中,輸出流是指將程序中的數據(內存數據)以流的形式向外部(系統,網絡)輸出傳遞出去。安全

  2. 經常使用的IO類有哪些?服務器

    答:FileInputStream,FileOutputStream,FileWriter,FileReader,ObjectOutputStream,ObjectInputStream,ByteArrayInputStream,ByteArrayOutputStream,InputStreamReader,OutputStreamWriter,BufferedReader,BufferedWriter網絡

  3. 你在呢麼理解IO、BIO、NIO、AIO?架構

    答:IO輸入輸出流,BIO阻塞IO也就是傳統IO,NIO是非阻塞IO,AIO是異步非阻塞IO併發

    IO的對比
    對比總結 BIO NIO AIO
    IO方式 同步阻塞 同步非阻塞 異步非阻塞
    API使用難度 簡單 複雜 複雜
    可靠性
    吞吐量
    BIO
    • 適用於鏈接較少,對服務器資源消耗很大,可是編程簡單。是同步阻塞的。
    • 舉例:你到餐館點餐,而後在那兒等着,什麼也作不了,只要飯尚未好,就要必須等着
    NIO
    • 使用於鏈接數量比較多且鏈接時間比較短的架構,好比聊天服務器,編程比較複雜。是同步非阻塞的
    • 舉例:你到餐館點完餐,而後就能夠去玩兒了,玩一下子就回飯館問一聲,飯好了沒。
    AIO
    • 適用於鏈接數量多並且鏈接時間長的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜。是異步非阻塞的。
    • 舉例:飯館打電話給你說,咱們知道你的位置,待會兒給您送來,你安心的玩兒就能夠了。相似於外賣。
  4. 什麼是比特、字節和字符?異步

    答:編碼

    比特bit是計算機處理數據最基本的單位,一個bit由0或1表示。code

    8bit=1byte 8個比特等於1個字節。對象

    一個字符是一個單位的字形、類字形單位或符號的基本信息,字符裏面涉及到字符編碼集,Java中的字符是Unicode編碼,不一樣的字符編碼集支持不一樣的字符符號,並且所佔大小有所差異,通用的UTF-8編碼集中英文佔一個字節,漢字須要3-4個字節

  5. Java有哪幾種類型的流?

    答:

    • 按照流向劃分:輸出流和輸入流

    • 按照處理單位劃分:字符流和字節流

    • 按照功能劃分:基礎流和功能(包裝)流

  6. 字節流和字符流有什麼區別?

    答:字節流式按照字節單位進行處理的流,字符流式在字節流基礎上作的封裝通常會根據字符編碼集中字符的大小進行IO操做

  7. Java的序列化是什麼?

    答:序列化就是將Java程序中的對象數據或內存中須要序列化的數據持久化到計算機磁盤上,將其轉換爲可傳輸可存儲的二進制形式

  8. 怎麼序列化一個對象?

    答:序列化的方式不少,首先將須要序列化的類實現Serializable接口,常見的有JDK提供的ObjectOutPutStream或者JSON格式序列化等等

  9. Java有哪兩種方式實現序列化?

    答:

    1. 將須要序列化的類實現Serializable接口,而後私有ObjectOutputStream將對象序列化
    2. 使用Externalizable,他是Serializable接口的子類,有時咱們不但願序列化那麼多,可使用這個接口,這個接口的writeExternal()和readExternal()方法能夠指定序列化哪些屬性
  10. 怎麼控制類中的變量不被序列化?

    答:須要序列化的類要實現Serializable接口,這是必須的,而後將類中不須要序列化的屬性加上transient修飾符

  11. 靜態變量能不能被序列化?

    答:不會

  12. OSI的七層模型都有哪些?

    答:物理層 數據鏈路層 網絡層 傳輸層 會話層 表示層 應用層

  13. TCP和UDP協議有什麼區別?

    答:TCP是面向鏈接的的傳輸層協議,是一種安全、可靠、基於字節的傳輸協議。UDP是面向無鏈接的傳輸協議,不保證數據能被對方接收,容易致使數據丟失但傳輸效率高

    TCP具備高可靠性,確保傳輸數據的正確性,UDP在傳輸數據前不創建鏈接,應用程序須要負責傳輸可靠性方面的全部工做

    TCP對系統資源要求較多,UDP對系統資源要求較少

    UDP具備較好的實時性,工做效率較TCP高

    UDP的段結構比TCP的段結構簡單,網絡開銷也小

  14. TCP爲何要三次握手?

    答:

    緣由一:防止重複鏈接

    三次握手的主要緣由是爲了防止舊的重複鏈接引發鏈接混亂問題。

    好比在網絡情況比較複雜或者網絡情況比較差的狀況下,發送方可能會連續發送屢次創建鏈接的請求。若是 TCP 握手的次數只有兩次,那麼接收方只能選擇接受請求或者拒絕接受請求,但它並不清楚此次的請求是正常的請求,仍是因爲網絡環境問題而致使的過時請求,若是是過時請求的話就會形成錯誤的鏈接。

    因此若是 TCP 是三次握手的話,那麼客戶端在接收到服務器端 SEQ+1 的消息以後,就能夠判斷當前的鏈接是否爲歷史鏈接,若是判斷爲歷史鏈接的話就會發送終止報文(RST)給服務器端終止鏈接;若是判斷當前鏈接不是歷史鏈接的話就會發送指令給服務器端來創建鏈接。

    緣由二:同步初始化序列化

    經過上面的概念咱們知道 TCP 的一個重要特徵就是可靠性,而 TCP 爲了保證在不穩定的網絡環境中構建一個穩定的數據鏈接,它就須要一個「序列號」字段來保證本身的穩定性,而這個序列號的做用就是防止數據包重複發送,以及有效的解決數據包接收時順序顛倒的問題。

    那麼在創建 TCP 鏈接時就須要同步初始化一個序列號來保證 TCP 的穩定性,所以它須要執行如下過程:

    ●首先客戶端發送一個攜帶了初始序列號的 SYN 報文給服務器端;

    ●服務端接收到消息以後會回覆一個 ACK 的應答報文,表示客戶端的 SYN 報文已被服務端成功接收了;

    ●而客戶端收到消息以後也會發送一個 ACK 給服務端,服務器端拿到這個消息以後,咱們就能夠獲得一個可靠的初始化序列號了。

    而若是是兩次握手的話,就沒法進行序列號的確認工做了,所以也就沒法獲得一個可靠的序列號了,因此 TCP 鏈接至少須要三次握手。

    以上兩種緣由就是 TCP 鏈接爲何須要三次握手的主要緣由,固然 TCP 鏈接還能夠四次握手,甚至是五次握手,也能實現 TCP 鏈接的穩定性,但三次握手是最節省資源的鏈接方式,所以 TCP 鏈接應該爲三次握手。

相關文章
相關標籤/搜索