Java網絡方面

最近在面試 有些概念懂 可是須要梳理一下 藉着面試看看本身會多少.java

1.網絡編程的同步 異步 阻塞 非阻塞?面試

同步:函數調用在沒有獲得結果以前,不返回任何結果;數據庫

異步:函數調用在沒有獲得結果以前,不返回任何結果,返回狀態值;編程

阻塞:函數調用在沒有獲得結果以前,線程掛起,獲得結果以後返回值。緩存

非阻塞:函數調用在沒有獲得結果以前,當前線程不會掛起,當即返回結果。服務器

2.Java如何實現無阻塞方式的Socket編程?網絡

NIO能夠有效解決多線程服務器存在的線程開銷問題,NIO的多線程不是爲了應對客戶端請求而獨立分配線程,多線程

而是經過多線程充分利用CPU的處理能力和處理的時間,達到提升服務效果。異步

3.什麼是Java序列化函數

爲了保存內存中各類對象的狀態(也就是實例變量,而不是方法),而且能夠把對象能夠讀取出來,雖然能夠經過方法保存對象狀態,java提供了對象

序列化機制更好的保存對象狀態(具體的對象序列化能夠參照Hibernate二級緩存)

4.什麼狀況下須要序列化?序列化須要注意什麼事情,如何實現Java序列化(串行化)?

Java對象序列化到文件或者數據庫中;

使用套接字在網絡上傳輸對象時須要進行序列化;

當但願RMI傳輸對象的時候;

序列化注意事情:

1).若是子類實現了序列化接口Sericalizable而父類未實現,父類必須提供一個無參構造函數,不然會拋出InvalidClassException異常。

2).類的靜態變量不會被序列化,由於這個靜態變量是類變量,而不是對象的。串行化保存的是是對象屬性,即非靜態的變量。

3.)Java序列化是爲了節約磁盤空間,具備特定規則。

4).序列化到同一文件,若是修改了相同對象的屬性再次保存時,所以只保存第二次的引用,讀取第一次的存儲。

 

5.Java有那幾種流?JDK提供哪些接口能夠繼承?

Java提供的流對象

InputStram 字節輸入流 OutputStream 字節輸出流 Reader 字符輸入流 Writer 字符輸出流

按流向劃分:

輸出: 輸出字節流 OutputStraam 輸出字符流 Writer

輸入: 輸入字節流InputStream 輸入字符流 Reder

按照傳輸單位劃分:

字節流:8位 一個比特 通常狀況下圖片 等是二進制文件

字節流:16位 兩個比特

6.用Java Socket編程

比較典型的Java Socket編程,發送請求後,等待服務器響應。 (這個過程存在阻塞方法)

大概過程

1.建立一個Socket實例,構造函數先遠處服務器域名和端口 簡歷TCP鏈接

2.經過IO流與服務器創建鏈接(這個地方存在阻塞方法)

3.IO流中讀取數據 而且 Socket關閉鏈接;

 

服務器的構建模型

1.建立一個ServerSocket端口監聽,設置監聽端口,用於獲取TCP鏈接

2.重複執行(whlie(true))監聽狀態一直持續

3.調用ServerSocket 的accept()方法,返回一個客戶端鏈接實例

4.爲返回的Socket建立一個新的線程,用於進行線程的服務。

5.通信完成,關閉Socket的close()

7.TCP有鏈接時候有三次握手?斷開鏈接有幾回握手?

             客戶端                                                   服務器

              | (發送請求 i)                                               |

              |                   --------------->  (i)                 |(建立j,而且i+1)

             |                  <---------------(j,i+1)               |

             | (獲取 j,i+1) 而且(j+1,i+)                             |

             |                    -------------->(j+1,i+1)          |(獲取j+1,i+1) 完成握手

seq 是包自己的序列號 ack是確認鏈接

一次釋放 斷開鏈接請求 確認斷開鏈接

相關文章
相關標籤/搜索