2013-10-07 64 views
0

我想創建一個我自己的Web服務器,並且有關於我們今天使用的Web服務器的工作的幾個問題。問題是:實現一個Web服務器

  1. 在通過端口80從客戶端收到HTTP請求後,服務器是否使用相同的端口80響應?
  2. 如果是,那麼在發送大文件時,如果以MB爲單位表示圖片,Web服務器將無法接收來自其他客戶端的請求?
  3. 是計算機端口雙工還是單工? (它可以同時發送和接收)?
  4. 如果服務器端的另一個端口用來發送回應客戶端,然後(如果使用TCP,通常使用的),再3路握手會做,這將是開銷...

回答

1

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html這裏是發生了什麼事情與Web服務器具有很好的指導,雖然這是在C,但這些概念都在那裏。這將解釋整個客戶端服務器關係以及一些實現細節。

我只想給出一個關於發生了什麼的高層次: 通常會發生什麼情況是當您的服務器收到一個新的請求時創建一個將處理它的分支,這樣您就不會被每個分支請求,當請求進入子進程時,傳遞一個新文件來寫入(同樣這是所有的實現細節)。

所以你真的有一臺服務器在等待請求,併爲它收到的每個請求生成一個子進程來處理這個請求。我確信有比c更容易實現這些東西的語言(我必須在我以前同時執行ac和java服務器服務),但c真的讓你瞭解正在發生的事情,而且我賭注,這就是你在這裏尋找

現在有幾件事情要考慮: 你想如何工作的web服務器。該示例解釋了父級子進程。 你是否想要使用tcp/UDP在傳遞有效載荷的方式上存在差異。 您不必在端口80上連接,這只是web的默認設置。

希望導遊會幫助你。

0
  1. 是的。服務器使用客戶端建立的TCP連接發送響應,因此它也使用相同的端口進行響應。由於TCP連接由(local-ip,local-port,remote-ip,remote-port)標識,因此服務器可以使用相同的端口處理多個客戶端的連接,因此服務器甚至可以處理來自同一客戶端的多個連接,前提是源端口是不同的。
  2. 您可以使用不同的技術來同時爲多個客戶端提供服務。這些包括使用多個進程或線程的

    • :當一個人忙於爲客戶端服務時,其他客戶端可以爲其他客戶端服務。
    • 使用事件:服務器監聽來自操作系統的事件:當它可以寫數據塊寫入它,當一個新的客戶端連接它接受連接,連接...

    常見兩種方法都要結合在一起。

  3. TCP連接是雙工的:您可以同時發送和接收。 HTTP協議基於一個簡單的請求 - 響應模型:在任何時候,只有一方正在「交談」。
+0

我的重點是服務器端口。該端口是否可以向客戶端發送響應並同時偵聽新的客戶端請求?如果是,那麼編程方式如何?如果沒有,那麼使用什麼技術來避免服務器必須發送大文件(比如圖像文件)的這種情況,並且同時可以隨時用於傳入的客戶端請求... –

+0

是的,它可以,並且這是在所有套接字API是用於接受連接的套接字與用於與客戶端通信的套接字分開的。我建議你在你喜歡的操作系統上找到你喜歡的編程語言的網絡編程教程,因爲它可以解釋所有這些...... – Joni

+0

你可以在c或Java代碼上實現這一行:「用於接受連接的套接字是獨立的來自用於與客戶溝通的套接字。「 ?。 (因爲他們說)是 ServerSocket welcomeSocket = new ServerSocket(6789);因爲當我在Java中查看任何教程時,它的完成方式(如他們所說)是 ServerSocket welcomeSocket = new ServerSocket(6789); (true){ \t Socket connectionSocket = welcomeSocket.accept(); 現在這裏如果我通過tcpdump或netstat監視我的網絡活動或列出nmap等開放端口,它不會顯示任何其他端口(除了onServer正在偵聽)用於向客戶端發送數據。 –