2013-04-08 78 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