java面試---Socket

1. 對套接字編程的理解,它的協議是如何的?

socket通常稱爲“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。應用程序通過套接字向網絡發出請求或應答網絡請求。

服務器和客戶端通過socket進行交互。服務器需要綁定在本機的某個端口號上,客戶端需要聲明自己連接哪個地址的哪個端口,這樣服務器和客戶端就能連接了。

根據連接啓動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分爲三個步驟:服務器監聽,客戶端請求,連接確認。
(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。
(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。
(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
socket是對TCP/IP協議的封裝和應用。在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連接。
第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確認。
第二次握手:服務器接收客戶端syn包並確認(ack=j+1),同時向客戶端發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態。
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

服務器socket與客戶端socket建立連接的部分其實就是“三次握手”。

2. socket和http的區別

socket連接
socket不屬於協議範疇,而是一個調用接口(API),是對TCP/IP協議的封裝。實現服務器與客戶端之間的物理連接,並進行數據傳輸。Socket處於網絡協議的傳輸層,主要有TCP/UDP兩個協議。
socket連接是長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由於各種環境因素可能會是連接斷開,比如:服務器端或客戶端主機宕機了、網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火牆可能會斷開該連接以釋放網絡資源。所以當一個socket連接中沒有數據的傳輸,那麼爲了維持連接需要發送心跳消息
socket傳輸的數據可自定義,爲字節級,數據量小,可以加密,數據安全性高,適合Client/Server之間信息實時交互

http連接:
HTTP是基於TCP/IP協議的應用層協議,定義的是傳輸數據的內容的規範。
HTTP是基於請求-響應形式並且是短連接,即客戶端向服務器端發送一次請求,服務器端響應後連接即會斷掉。
HTTP是無狀態的協議,針對其無狀態特性,在實際應用中又需要有狀態的形式,因此一般會通過session/cookie技術來解決此問題。
HTTP的傳輸速度慢,數據包大,數據傳輸安全性差,如實現實時交互,服務器性能壓力大

3. socket和http的應用場景有哪些

socket一般用於比較即時的通信和實時性較高的情況,比如推送,聊天,保持心跳長連接等;
http一般用於實時性要求不那麼高的情況,比如信息反饋,圖片上傳,獲取新聞信息等。

某些場合使用http不使用socket的原因是socket一旦連接上了,就一直保持連接,就會造成阻塞IO,與此相對的的,還有非阻塞IO。
阻塞IO是指客戶端請求服務器端,服務器端進行處理後,返回值給客戶端。但當客戶端太多、同時併發請求的時候,服務器端處理不過來,就會卡,因此提出了非阻塞IO,客戶端請求服務器端,服務器端有一些監聽器負責接受請求,接受好了,就告訴客戶端已經接受好了,處理完後把數據發給客戶端。

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態。
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後纔會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章