2013-05-06 61 views
0

我正在寫HTTP WEB服務器代碼。意思就是,我必須對使用端口的重試策略進行編碼,以便在該端口服務器上可以監聽客戶端的請求。如何編碼服務器端的端口重試策略來監聽客戶端請求?

正常碼:

serversocket = new ServerSocket(ServerSettings.port); 

它拋出異常,如果ServerSettings.port是不是免費的。

現在,我想添加重試策略,如果ServerSettings.port不是免費的,請嘗試其他端口。對於我寫的一個代碼,代碼是S-如下,

更新的代碼:

try { 
      serversocket = new ServerSocket(ServerSettings.port); 
     } catch (IOException io) { 
      try { 
       ServerSettings.port += 505; 
       serversocket = new ServerSocket(ServerSettings.port); 
      } catch (IOException io1) { 
       try { 
        ServerSettings.port += 505; 
        serversocket = new ServerSocket(ServerSettings.port); 
       } catch (IOException io2) { 
        log.info(new Date() + "Problem occurs in binding port"); 
       } 
      } 
     } 

但上面顯示一個糟糕的編碼技能,而不是專業的。

如何以專業的方式爲端口編寫重試策略,以便服務器可以在該端口上偵聽?

+0

也許把它包裝在一個'while-loop'中,檢查一個'boolean'類型變量,它告訴端口是否空閒?在創建對象之後:'portIsFree = true',並且再次嘗試的條件是'portIsFree == false' – Novak 2013-05-06 09:09:55

+0

@GuyDavid檢查端口是否空閒的方法是什麼? – devsda 2013-05-06 09:11:45

+0

'ServerSocket'如果未能使用給定的端口,將會拋出異常,所以它不會在之後執行任何代碼 - 它會通過設置'portIsFree = true;'的行並跳轉到catch部分。循環將繼續,因爲'portIsFree'仍然設置爲'false'。 – Novak 2013-05-06 09:14:20

回答

1

從邏輯上講,我認爲這會工作(糾正我,如果有任何語法拼寫錯誤):

ServerSocket serversocket; 
boolean foundPort = false; 

while (!foundPort) 
{ 
    try { 
      serversocket = new ServerSocket(ServerSettings.port); // If this fails, it will jump to the `catch` block, without executing the next line 
      foundPort = true; 
    } 
    catch (IOException io) { 
      ServerSettings.port += 505; 
    } 
} 

你可以把它包在一個函數,而不是foundPort = true;,你將返回Socket對象。

+0

非常感謝:)我還有一個問題,請幫助我,並鏈接如下,http://stackoverflow.com/questions/16395396/how-to-add-feature-of-shutdown-in -http-web服務器/ 16395478?noredirect = 1#16395478 – devsda 2013-05-06 09:32:36

相關問題