2012-07-19 93 views
1

我希望在同一個端口上有多個服務器會導致問題。實際上,當我嘗試在同一端口上啓動兩臺服務器時,我希望它會引發異常。問題是,在同一個端口上啓動多個服務器似乎更令人高興。我可以有很多下面的代碼運行正常,沒有例外。我可以將多臺服務器綁定到同一個TCP端口嗎?

import BaseHTTPServer 
import SimpleHTTPServer 
import sys 

def main(): 
    try: 
     server = BaseHTTPServer.HTTPServer(('127.0.0.1',5000), SimpleHTTPServer.SimpleHTTPRequestHandler) 
     print "On port: " + str(server.socket.getsockname()[1]) 
    except Exception, e: 
     print e 
    server.serve_forever() 

if __name__ == "__main__": 
    main() 

所有這些都聲稱自己是在端口5000。我怎樣才能得到它,如果它試圖使用已被使用的端口拋出一個異常?

編輯:這是Python的2.6.4

編輯2:http://www.youtube.com/watch?v=rVOG3JdbHAM&feature=youtu.be因爲人們似乎認爲我所解釋是不可能的?或者我完全誤解了人們。無論哪種方式,這個視頻應該清除它。我啓動了兩臺服務器,他們都沒有打印任何異常。當我關閉第一個時,第二個開始工作。這是爲什麼發生?我希望第二臺服務器根本不會啓動並打印一個異常。這不是應該發生什麼?

+2

嗯,你隱藏了例外。如果初始化失敗,將立即終止('server'不會被設置)。 – phihag 2012-07-19 22:37:20

+0

是的,我知道這一點。這只是一個簡單的片段,說明我在同一個端口上有許多服務器的問題。 – Justin 2012-07-19 22:48:21

+2

你必須弄錯,底層操作系統不允許兩個進程在同一個端口上打開套接字服務器。故事中必須有更多。 – 2012-07-19 23:00:21

回答

1

我試圖執行代碼,並返回的第二個實例,

[Errno 98] Address already in use 

,因爲它應該。 SuSE Linux上的Python 2.6。

可以用netstat實用程序檢查端口5000是否真的被佔用?

+0

我在Windows 7上運行。它將端口狀態列爲TIME_WAIT。 – Justin 2012-07-19 22:45:28

+0

好的,所以它不聽。服務器甚至沒有啓動(我不知道爲什麼)。如果顯示「netstat -na」,端口應處於LISTEN模式。 – LSerni 2012-07-19 22:50:09

+0

但奇怪的是,它仍然有效。如果我等了很長時間,再次運行netstat,127.0.0.1:5000甚至沒有列出。但是,如果我在瀏覽器中導航,則會提供正確的文件,並將端口再次列爲TIME_WAIT。 (如果我使用不同的端口,則不會提供任何文件) – Justin 2012-07-19 22:53:03

0

TCP端口可以被一個且只有一個進程綁定。正如@phihag指出的那樣,你只會認爲你有多臺服務器綁定到5000端口,因爲你拋棄了那個會告訴你你已經綁定了這個端口的異常。

我在Windows 7上運行它列出的TIME_WAIT

這是這通常是由客戶端無法正常關閉連接造成的次要問題的端口狀態。 TIME_WAIT是valid TCP state,但其中一個需要2 minutes for the server to clear。你應該看看你的客戶爲什麼放棄連接,而不是讓服務器關閉它。

如果您在客戶端使用標準瀏覽器,則應該假設您的服務器代碼中有第二個錯誤,但您沒有在此顯示。

響應添加評論

有什麼問題您的期望。您的代碼的這個版本應該清楚:

def bind(): 
    return BaseHTTPServer.HTTPServer(('127.0.0.1',5000), SimpleHTTPServer.SimpleHTTPRequestHandler) 

s1 = bind() 
s2 = bind() 

最後一行將終止您的程序與「地址已在使用」例外。如果您選擇忽略(或捕獲並丟棄)該異常,則s2將不具有有效的服務器。這是例外情況告訴你的。在C,如果你忽略的錯誤相同方式,它看起來像:

fp = fopen("a_file_that_does_not_exist", "r") 
fgets(buf, BUFSIZ, fp) 

兩個fopenfgets將返回EOF你所忽略。該程序將運行,但它肯定不會做任何有用的事情,因爲您無法讀取不存在的文件。您可以忽略錯誤返回,但將雙手放在眼睛上並不會使怪物消失。

+0

)我必須對你和phihag意味着什麼將拋棄異常置之不理(Python新手)我認爲通過使用除了塊之外的塊在啓動服務器時捕獲和打印異常,當我將它設置爲netstat列爲ESTABLISHED的端口時,它似乎正確捕獲並打印了一個異常 – Justin 2012-07-19 23:06:52

+1

捕獲異常不會處理異常,假設您打開一個讀取的文件不存在,它會引發一個異常,捕獲該異常並打印一條消息將不會讓你看到一個可讀的文件,它會讓你的程序繼續處理一個不可讀的文件「句柄」。因此,每個'file.read()'都會失敗;因此,你「捕獲」了異常,但沒有解決「沒有文件讀取」的問題,你在這裏做的是同樣的事情,但是文件比較容易可視化比套接字 – msw 2012-07-19 23:11:53

+0

好的。所以這仍然在做我期望的。在這個例子中,我並不試圖切換到備份端口。這只是爲了說明當我嘗試在端口上打開兩臺服務器時,我沒有收到任何異常。 – Justin 2012-07-19 23:16:22

0

我同意各種答案和評論,指出你不能有多個偵聽器到單個TCP端口;但是,我正在經歷與OP相同的行爲。我正在運行Windows 8,並且我的程序(用C++編寫,使用Boost)的實例都沒有拋出異常。從netstat輸出看起來像:

C:\windows\system32>netstat -an 

Active Connections 

    Proto Local Address   Foreign Address  State 
    TCP 0.0.0.0:135   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:445   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:5357   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:7112   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:17500   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:49152   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:49153   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:49154   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:49155   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:49157   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:50102   0.0.0.0:0    LISTENING 
    TCP 0.0.0.0:50102   0.0.0.0:0    LISTENING 
    TCP 127.0.0.1:2559   0.0.0.0:0    LISTENING 
    TCP 127.0.0.1:19872  127.0.0.1:49248  ESTABLISHED 
    TCP 127.0.0.1:49248  127.0.0.1:19872  ESTABLISHED 
    TCP 127.0.0.1:50102  127.0.0.1:52616  TIME_WAIT 
    TCP 127.0.0.1:50102  127.0.0.1:52618  TIME_WAIT 
    TCP 127.0.0.1:50102  127.0.0.1:52620  TIME_WAIT 
    TCP 127.0.0.1:50102  127.0.0.1:52622  TIME_WAIT 

在這種情況下,第一個程序實例開始監聽端口50102接收所有的客戶端連接。然後,當我關閉該實例時,第二個實例開始接收客戶端連接。奇怪而真實。

我希望第二個程序實例將無法開始監聽與第一個實例相同的端口。

相關問題