2009-02-02 21 views
13

我運行了幾個遊戲隧道服務器,並希望有一個頁面,客戶端可以在所有服務器上運行ping命令,並找出哪些響應最爲敏感。據我所見,似乎沒有正確的方法來做到這一點在JavaScript中,但我想,有沒有人知道在閃光燈或其他客戶端瀏覽器技術可能做到這一點?如何通過瀏覽器確定遠程服務器的等待時間

+0

我對你的解決方案很感興趣。有機會得到一些結果嗎?提前致謝 ! – 2009-03-22 23:26:58

+0

對我來說最有趣的答案是Eliram的一個答案(http://stackoverflow.com/questions/503199/how-to-determine-latency-of-a-remote-server-through-the-browser/575542#575542 ),但StackOverflow已經爲我選擇了答案。儘管如此,我還沒有做出這個計劃。我不是flash dev – 2009-03-23 10:10:01

回答

17

大多數applet技術,包括Javascript,都實施了一個同源策略。可以動態添加DOM元素(如圖像),並使用onload事件處理程序收集時間信息。

僞代碼

for (server in servers) { 
    var img = document.createElement('IMG'); 
    server.startTime = getCurrentTimeInMS(); 
    img.onload=function() { server.endTime = getcurrentTimeInMS(); } 
    img.src = server.imgUrl; 
} 

然後等待適當的時間,並檢查定時爲每個服務器對象。如果需要,根據需要重複計算平均值。我不確定你可以期待什麼樣的準確性。

缺點:

  • 您可能正在使用錯誤的工作工具。瀏覽器沒有配備這種應用程序。
  • 這可能是相當不準確的。
  • 如果你請求的資源被緩存了,它不會給你你想要的結果,但是你可以通過每次更改url來解決這個問題。
  • 與普通ping相比,這是帶寬密集型的。使圖像變得很小,如spacer.gif文件。
  • 時間不僅取決於遠程服務器的延遲,還取決於該服務器的帶寬。這可能是一個或多或少有用的衡量標準,但重要的是要注意,這不僅僅是延遲。
  • 您需要能夠提供來自各種服務器的HTTP請求,關鍵的是,每個服務器應該提供完全相同的資源(或者具有相同長度的資源)。服務器上的條件會影響響應時間,例如,如果一臺服務器正在壓縮數據,而另一臺服務器則不是。
2

如果你正在談論運行客戶端的東西,我不確定這是可能的,由於安全原因。

也許你最好的選擇是一個Java小程序 - 但這又需要根據本地安全策略進行檢查。

如果我試着去想JS中的一些破解操作,也許你可以嘗試發送一個異步請求和一個回調函數,它測量了它花費的毫秒數 - 但這只是我的頭頂。

+0

我知道我可以做的一種方式是發送HEAD請求,但我更希望有一種方法可以使用閃存? – 2009-02-06 07:42:15

+0

Java小程序只允許聯繫其原始服務器。 – Magnar 2009-02-18 09:58:58

+0

如果他們已被簽名並被接受,則允許具有更寬鬆安全性的小程序。或者至少他們曾經是。上次我看到一個是Netscape 4. – 2009-02-25 02:10:37

1

'文件坪'的問題是你會評估http服務器響應,而你服務的遊戲的目標資源可能會有非常不同的行爲,從而有不同的延遲。

只是一個想法,根據實際情況可能甚至是不切實際的: 但是,根據服務器在遊戲過程中通常由服務器執行的一小段任務創建服務器腳本, (例如,打開一個RTMP連接,檢索信息並將其發回)。根據服務器的總數,您幾乎可以同時打開它們,並將第一個響應定義爲贏者(減去客戶端獨立處理每個查詢所需的時間)。

當然,這是一個相當昂貴的服務器端方法,但至少希望得到可靠的結果(總結服務器和網絡延遲)。即使需要花費幾秒鐘的時間來評估,這也是總體愉快遊戲的一小部分。

6

調用服務器之前,記錄的Javascript時間:

var startTime = new Date(); 

負載從服務器的圖像:

var img = new Image() 
img.onload = function() { 
    // record end time 
} 
img.src = "http://server1.domain.com/ping.jpg"; 

只要請求後,再次記錄時間。 (鑑於當然該請求未超時的)

var endTime = new Date(); 

你以毫秒爲單位的ping是:

var ping = endTime. getTime() - startTime.getTime(); 
5

您真正需要的是從連接開始的時間,以時間第一個就緒狀態改變...

 
function getPing() { 
    var start; 
    var client = getClient(); // xmlhttprequest object 
    client.onreadystatechange = function() { 
    if (client.readyState > 0) { 
     pingDone(start); //handle ping 
     client.onreadystatechange = null; //remove handler 
    } 
    } 

    start = new Date(); 
    client.open("HEAD", "/ping.txt"); //static file 
    client.send(); 
} 

function pingDone(start) { 
    done = new Date(); 
    ms = done.valueOf() - start.valueOf(); 
    alert(ms + "ms ping time"); 
} 

function getClient() { 
    if (window.XMLHttpRequest) 
    return new XMLHttpRequest(); 

    if (window.ActiveXObject) 
    return new ActiveXObject('MSXML2.XMLHTTP.3.0'); 

    throw("No XMLHttpRequest Object Available."); 
} 
2

在Flash中測量服務器響應時間並不難。

在訪問遠程服務器之前,Flash必須詢問策略文件。 對於這樣的策略文件的默認位置是在服務器的根文件夾:的/crossdomain.xml

(你可以很容易地找到有關跨域文件格式的信息)

由於需要無論如何,爲什麼不這樣的文件用它來衡量服務器的響應時間?加載文件本身而不是圖像,並測量使用getTimer()所花費的時間。

這會給你一個很好的HTTP連接評估。

但是,如果您正在處理遊戲服務器,您可能需要直接檢查TCP連接的速度。要做到這一點,您需要使用flash.net.Socket 您還需要先運行以下命令來請求策略文件: Security.loadPolicyFile(「xmlsocket://server.domain.com:5342」) ;

其中5342表示您的服務器的端口號,它應使用正確的XML策略字符串進行響應。 進行套接字連接後,任何請求/響應都會讓您測量不同的服務器響應時間。

3

下面是一個方法:

http://magnetiq.com/exports/server_ping.png

有兩列創建一個表(不一定是在字面意義上<table>)。第一列將保存服務器的名稱(以及可能的鏈接)。第二列包含從相應服務器加載探測文檔的iframe。每個探針文件執行此在初始讀取請求:

  1. 獲取當前系統時間
  2. 執行重定向(302)到第二探針文檔,同時通過將系統時間作爲查詢參數
  3. 所述第二探針文檔讀取當前系統時間,從傳遞給它的初始讀數計算增量,並以大字母顯示。這個增量將是服務器用重定向響應加上客戶端向重定向目標發出第二個請求所花費的時間來響應客戶端的時間。這不完全是一個「平」,但它是客戶端與每個服務器的相對延遲的可比較度量。事實上,這是從服務器到客戶端的「反向ping」。

您會在不侵犯同域策略的情況下使用iframe,因爲根本沒有嘗試操縱iframe內容。玩家只需用他/她自己的眼睛看到數值,然後您就可以依靠用戶瀏覽數字並點擊最有意義的服務器鏈接。

2

請記住,如果您最終使用TCP查詢來測量延遲,則延遲將至少是ping的兩倍,因爲您需要三次握手和終止包至少(兩次往返而不是一次)。如果您發出HTTP請求,請儘量減少標題。足夠長的標題(由於服務器或客戶端上的cookie等)可以增加額外的往返次數,從而拋棄測量結果。

相關問題