2013-04-08 33 views
1

我正在寫一個html頁面,需要創建一個websocket服務器靜態HTML頁面創建的WebSocket連接golang服務器直接

在服務器上,我用「code.google.com/p的例子/go.net/websocket「只是接受連接。

然而,在Chrome26的響應是

WebSocket連接到 'WS://127.0.0.1:1234 /' 失敗:意外的響應代碼:400

有什麼遺漏(如握手)?

這是我html和服務器使用go

<html> 
<head></head> 
<body> 
<script type="text/javascript"> 
    var sock = null; 
    var wsuri = "ws://127.0.0.1:1234"; 

    window.onload = function() { 

     console.log("onload"); 

     sock = new WebSocket(wsuri); 

     sock.onopen = function() { 
      console.log("connected to " + wsuri); 
     } 

     sock.onclose = function(e) { 
      console.log("connection closed (" + e.code + ")"); 
     } 

     sock.onmessage = function(e) { 
      console.log("message received: " + e.data); 
     } 
    }; 

    function send() { 
     var msg = document.getElementById('message').value; 
     sock.send(msg); 
    }; 
</script> 
<h1>WebSocket Echo Test</h1> 
<form> 
    <p> 
     Message: <input id="message" type="text" value="Hello, world!"> 
    </p> 
</form> 
<button onclick="send();">Send Message</button> 
</body> 
</html> 

// ---------------------------- -

package main 

import (
    "code.google.com/p/go.net/websocket" 
    "fmt" 
    "log" 
    "net/http" 
) 

func Echo(ws *websocket.Conn) { 
    var err error 

    for { 
     var reply string 

     if err = websocket.Message.Receive(ws, &reply); err != nil { 
      fmt.Println("Can't receive") 
      break 
     } 

     fmt.Println("Received back from client: " + reply) 

     msg := "Received: " + reply 
     fmt.Println("Sending to client: " + msg) 

     if err = websocket.Message.Send(ws, msg); err != nil { 
      fmt.Println("Can't send") 
      break 
     } 
    } 
} 

func main() { 
    http.Handle("/", websocket.Handler(Echo)) 
    if err := http.ListenAndServe(":1234", nil); err != nil { 
     log.Fatal("ListenAndServe:", err) 
    } 
} 

回答

5

Chrome瀏覽器可能引發錯誤400,因爲它認爲你正在嘗試做跨域請求到WebSocket伺服器,並認爲這是不可能的,你有權限。

爲了解決這個問題,你只需要從你的服務器go服務器的HTML服務器。

因此改變你的sock.go代碼:

package main 

import (
    "code.google.com/p/go.net/websocket" 
    "fmt" 
    "log" 
    "net/http" 
) 

func Echo(ws *websocket.Conn) { 
    var err error 

    for { 
     var reply string 

     if err = websocket.Message.Receive(ws, &reply); err != nil { 
      fmt.Println("Can't receive") 
      break 
     } 

     fmt.Println("Received back from client: " + reply) 

     msg := "Received: " + reply 
     fmt.Println("Sending to client: " + msg) 

     if err = websocket.Message.Send(ws, msg); err != nil { 
      fmt.Println("Can't send") 
      break 
     } 
    } 
} 

func main() { 
    http.Handle("/", http.FileServer(http.Dir("."))) // <-- note this line 
    http.Handle("/socket", websocket.Handler(Echo)) 
    log.Println("serving") 
    if err := http.ListenAndServe(":1234", nil); err != nil { 
     log.Fatal("ListenAndServe:", err) 
    } 
} 

和你index.html文件添加到同一個目錄中的文件sock.go:

<html> 
<head></head> 
<body> 
<script type="text/javascript"> 
    var sock = null; 
    var wsuri = "ws://127.0.0.1:1234/socket"; // <-- note new path 

    window.onload = function() { 

     console.log("onload"); 

     sock = new WebSocket(wsuri); 

     sock.onopen = function() { 
      console.log("connected to " + wsuri); 
     } 

     sock.onclose = function(e) { 
      console.log("connection closed (" + e.code + ")"); 
     } 

     sock.onmessage = function(e) { 
      console.log("message received: " + e.data); 
     } 
    }; 

    function send() { 
     var msg = document.getElementById('message').value; 
     sock.send(msg); 
    }; 
</script> 
<h1>WebSocket Echo Test</h1> 
<form> 
    <p> 
     Message: <input id="message" type="text" value="Hello, world!"> 
    </p> 
</form> 
<button onclick="send();">Send Message</button> 
</body> 
</html> 

現在,您將能夠從內部連接鉻。

+0

但我不想自己處理協議沒有golang處理這個? – ljy2010a 2013-04-09 07:48:16

+0

這不是'處理協議'per-ce,更多的是處理瀏覽器。我已經更新了您的代碼,以便添加文件處理程序。如果您從文件系統加載文件,則必須無法連接,您必須通過http以相同的來源優先加載http文件。 – 2013-04-09 11:32:24

+0

其實我已經測試其他語言,使服務器像Java NETTY,C#他們都支持接受HTML創建WebSocket,沒有在服務器上,它只是一個HTML無論如何,我認爲有一個標籤在協議像「原」是錯過becasue的HTML是本地的,而golang websocket只是拒絕這個 – ljy2010a 2013-04-10 04:08:59

相關問題