如何做一個Web服務器使用同一端口(80)TCP連接成爲其客戶。對於UDP連接,我知道本身沒有連接,所以我們可以讓多個客戶端將數據包發送到相同的端口。如果我嘗試使用我的本地主機上已經使用的端口,我得到BindException。所有請求如何使用相同的端口連接到Web服務器?
一種解決方案我看到該被啓動線程爲每個連接,但是這難道不是很麻煩爲網站像谷歌/雅虎那裏在每個服務器中的> 100000連接?
做web服務器採用了這個問題有什麼解決辦法?
如何做一個Web服務器使用同一端口(80)TCP連接成爲其客戶。對於UDP連接,我知道本身沒有連接,所以我們可以讓多個客戶端將數據包發送到相同的端口。如果我嘗試使用我的本地主機上已經使用的端口,我得到BindException。所有請求如何使用相同的端口連接到Web服務器?
一種解決方案我看到該被啓動線程爲每個連接,但是這難道不是很麻煩爲網站像谷歌/雅虎那裏在每個服務器中的> 100000連接?
做web服務器採用了這個問題有什麼解決辦法?
服務器偵聽在一個熟知的端口(80)上,並在請求發送給工作套接字後將請求委託給工作套接字,這樣就可以爲下一個請求提供服務,你可以編寫自己的簡單服務器來了解發生了什麼事情。前充足的代碼。 [1]
[1] http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServer.java
第一它創建一個服務器套接字;
ServerSocket ss = new ServerSocket(port);
然後在指定的端口上列表並在接受請求後創建一個新的套接字;
Socket s = ss.accept();
如上代碼所示,它有一個工人線程池,所以在給定的時刻,你可以控制的要求數量得到由服務器在給定時間提供服務。其他人可能會在隊列中等待。
時,纔會獲得一個監聽端口,但連接有兩個端口,一個在連接的兩端。這個零件必須是唯一的。
所以,說你連接到google.com 80端口,那麼你的連接將有你的機器上的一些端口,說在google.com 42312和端口80。你可以看到你的連接netstat -a。要獲得較短的列表:netstat -an | grep的ESTABLISHED」用於顯示所有已建立的連接,而不解決他們的IP地址爲名稱。
據我所知,Apache will start a new thread for every request,這是一個很大的原因是事件驅動的服務器,比如Node.js的是little faster。谷歌和雅虎也有服務器噸,羅傑說這也是有道理的,儘管我並不十分確定谷歌在端口42312上的輸出到達端口80的計算機的詳細信息:P
所以你想在同一個端口上有很多的UDP數據包?來自不同的客戶? – SuperTron 2011-12-16 21:53:20
沒有。這只是與UDP的比較。我的主要問題是關於它如何在TCP連接中完成 – 2011-12-16 22:16:12