2014-01-05 80 views
3

我正試圖圍繞網絡套接字來包裹我的頭。到目前爲止,我的理解是,服務器創建一個綁定到特定端口的新套接字。然後它偵聽此套接字來處理客戶端請求。是否爲每個請求創建了新套接字?

我讀過這個教程http://docs.oracle.com/javase/tutorial/networking/sockets/definition.html和它說

如果一切順利的話,服務器接受連接。一旦接受, 服務器獲得一個綁定到同一本地端口的新套接字,並且其 的遠程端點設置爲客戶端的地址和端口。它需要 一個新的套接字,以便它可以繼續偵聽原始套接字的連接請求,同時趨向於連接的客戶端的需要。

這裏有幾件事情,我不太明白

如果一切順利的話,服務器接受連接。

  1. 這是否意味着客戶端請求已成功到達偵聽套接字?

一旦接受,服務器獲取綁定到相同的本地端口一個新的套接字和 也有它的遠程端點集到客戶端的地址和端口

  • 新套接字已創建。它也綁定到相同的端口,但它不偵聽傳入的請求。服務器處理的客戶端請求響應被寫入此套接字後,然後關閉。這是對的嗎?

  • 這是否意味着請求以某種方式從第一個套接字傳遞到第二個套接字?

  • 它需要一個新的插座,以便它可以繼續收聽到原來的 插座連接請求,而趨向於連接的客戶端的需求。

  • 因此,將創建新的套接字然後,對於傳入請求進行偵聽。是否有不同類型的插座?某種「聽」插座和其他?

  • 爲什麼服務器必須創建一個新的偵聽套接字?爲什麼它不能重複使用前一個?

  • 回答

    5
    1. 否。它表示傳入連接到達服務器。
    2. No.如果服務器關閉它,它會被關閉。否則。
    3. 否。這意味着傳入的連接會導致連接完全形成,並在服務器上創建一個套接字來表示服務器端的端點。
    4. (a)否。創建一個新套接字到接收請求併發送響應。 (b)是。有被動和主動套接字。被動套接字監聽連接。一個活動套接字發送和接收數據。
    5. 它不必創建一個新的監聽(被動)套接字。它必須創建一個新的活動套接字作爲新連接的端點。

    是否爲每個請求創建了新套接字?

    大多數協議(例如HTTP保持活動狀態)允許每個連接有多個請求。

    +0

    關於1,_「[服務器是否接受連接]意味着客戶端請求已成功到達偵聽套接字?」_:「accept()」的結果_is_是一個正在工作的偵聽套接字。 – CodeCaster

    +1

    @CodeCaster編號accept()的結果是工作的*活動*套接字。監聽套接字是被動套接字:參見4(b)。就像OP一樣,你濫用術語'聆聽'。 – EJP

    +0

    你說得對,我現在看到它。謝謝。 – CodeCaster

    0

    1)傳入的連接已經抵達 2)插座沒有得到封閉 3)有服務器插座和插座正好。服務器socket.accept在客戶端連接時返回一個套接字對象

    相關問題