6

私はgoでwebsocketを使用しています。そして、次のようにグーグルで検索した簡単な例から、websocket url 形式を取得しました。

ws://{{$}}/ws

以下の比較的完全なコード:

home.html:

<html>
<head>
<title>Chat Example</title>
<script type="text/javascript">
    $(function() {
        ......
        if (window["WebSocket"]) {
            conn = new WebSocket("ws://{{$}}/ws");
            conn.onclose = function(evt) {
                appendLog($("<div><b>Connection closed.</b></div>"))
            }
            conn.onmessage = function(evt) {
                appendLog($("<div/>").text(evt.data))
            }
        } else {
            appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"))
        }
        ......
    });
</script>
</head>
</html>

wsServer.go:

package main

import (
    "flag"
    "log"
    "net/http"
    "text/template"
)
var addr = flag.String("addr", ":8080", "http service address")
var homeTempl = template.Must(template.ParseFiles("home.html"))

func serveHome(w http.ResponseWriter, r *http.Request) {
    ......
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    homeTempl.Execute(w, r.Host)
}

func main() {
    http.HandleFunc("/", serveHome)
    http.HandleFunc("/ws", serveWs)
    err := http.ListenAndServe(:8080, nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

実際には説明できませんが、正規表現だと思いました。

私は自分の PC ブラウザーでテストし、成功を次のように接続します。

http://localhost:8080 

しかし

http://ip:8080 (which ip is my computer's also the litsening server's ip)

いいえ。なぜ?

もちろん、「ws://{{$}}/ws」を特定の URL に変更すると機能します。しかし、私はその理由を知りたいです?そして、この式は何と一致するのでしょうか?

完全なサンプルコードは大きいですが、質問には上記で十分だと思います。何か見逃した場合は、このページで完全な例を見つけることができます: https://github.com/garyburd/go-websocket/tree/master/examples/chat

4

1 に答える 1

2

Go のテンプレートパッケージを使用していると思います。テンプレート パッケージは{{ placeholders }}、これらの中かっこで注釈が付けられているものをサポートします。これらの中括弧にはrangeifなどのステートメントや変数名が含まれる場合があります。変数名は、メソッド$に渡されたルート要素を指す特別な名前です。template.Execute

メソッドのコードを追加しwsServeて、テンプレートに渡す値を確認できるようにしてください。後で答えを拡張します。

于 2013-08-17T18:21:16.750 に答える