1. 程式人生 > >java網路程式設計面試題(一)

java網路程式設計面試題(一)

1tcp和udp的區別 

TCP:是面向連線的流傳輸控制協議,具有高可靠性,確保傳輸資料的正確性,有驗證重發機制,因此不會出現丟失或亂序。

UDP:是無連線的資料報服務,不對資料報進行檢查與修改,無須等待對方的應答,會出現分組丟失、重複、亂序,但具有較好的實時性,UDP段結構比TCP的段結構簡單,因此網路開銷也小。

2、tcp連線建立的時候3次握手,斷開連線的4次握手的具體過程

1.建立連線採用的3次握手協議,具體是指:

· 第一次握手是客戶端connect連線到server

· 第二次server accept client的請求之後,向client端傳送一個訊息,相當於說我都準備好了,你連線上我了

· 第三次 就是client向server傳送的,就是對第二次握手訊息的確認。之後client和server就開始通訊了。

2.斷開連線的4次握手,具體如下:

· 斷開連線的一端傳送close請求是第一次握手

· 另外一端接收到斷開連線的請求之後需要對close進行確認,傳送一個訊息,這是第二次握手

· 傳送了確認訊息之後還要向對端傳送close訊息,要關閉對對端的連線,這是第3次握手

· 而在最初發送斷開連線的一端接收到訊息之後,進入到一個很重要的狀態time_wait狀態,這個狀態也是面試官經常問道的問題,最後一次握手是最初發送斷開連線的一端接收到訊息之後。對訊息的確認。

3、什麼是同步?什麼是非同步?

同步:

如果有多個任務或者事件要發生,這些任務或者事件必須逐個地進行,一個事件或者任務的執行會導致整個流程的暫時等待,這些事件沒有辦法併發地執行;

非同步:

如果有多個任務或者事件發生,這些事件可以併發地執行,一個事件或者任務的執行不會導致整個流程的暫時等待。

這就是同步和非同步。

舉個簡單的例子,假如有一個任務包括兩個子任務A和B,對於同步來說,當A在執行的過程中,B只有等待,直至A執行完畢,B才能執行;而對於非同步就是A和B可以併發地執行,B不必等待A執行完畢之後再執行,這樣就不會由於A的執行導致整個任務的暫時等待。

如果還不理解,可以先看下面這2段程式碼:

void fun1() {

  // 超級複雜

}

void fun2() {

}

void function(){

    fun1();

    fun2()

    .....

    .....

}

這段程式碼就是典型的同步,在方法function中,fun1在執行的過程中會導致後續的fun2無法執行,fun2必須等待fun1執行完畢才可以執行。

接著看下面這段程式碼:

void fun1() {

}

void fun2() {

}

void function(){

    new Thread(){

    public void run() {

        fun1();

    }

}.start();

new Thread(){

    public void run() {

        fun2();

    }

}.start();

.....

.....

}

這段程式碼是一種典型的非同步,fun1的執行不會影響到fun2的執行,並且fun1和fun2的執行不會導致其後續的執行過程處於暫時的等待。

事實上,同步和非同步是一個非常廣的概念,它們的重點在於多個任務和事件發生時,一個事件的發生或執行是否會導致整個流程的暫時等待。我覺得可以將同步和非同步與Java中的synchronized關鍵字聯絡起來進行類比。當多個執行緒同時訪問一個變數時,每個執行緒訪問該變數就是一個事件,對於同步來說,就是這些執行緒必須逐個地來訪問該變數,一個執行緒在訪問該變數的過程中,其他執行緒必須等待;而對於非同步來說,就是多個執行緒不必逐個地訪問該變數,可以同時進行訪問。

同步和非同步可以表現在很多方面,但是記住其關鍵在於多個任務和事件發生時,一個事件的發生或執行是否會導致整個流程的暫時等待。一般來說,可以通過多執行緒的方式來實現非同步,但是千萬記住不要將多執行緒和非同步畫上等號,非同步只是巨集觀上的一個模式,採用多執行緒來實現非同步只是一種手段,並且通過多程序的方式也可以實現非同步。同步和非同步著重點在於多個任務的執行過程中,一個任務的執行是否會導致整個流程的暫時等待。

本文章為連載內容,大家可以持續關注小編,我將盡其所能的為大家提供技術性實踐資料、文章、視訊。

感謝大家的支援!

本文為原創作品,轉載請註明出處!