最近在面試 有些概念懂 可是須要梳理一下 藉着面試看看本身會多少.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是確認鏈接
一次釋放 斷開鏈接請求 確認斷開鏈接