3
votes

Websockets sur WebAssembly généré par golang?

Est-il possible d'écrire un client Websocket dans wasm over go? J'ai essayé d'utiliser gorilla / websocket , mais sans succès:

dial tcp: Protocol not available

J'obtiens l'erreur suivante en appelant ws () : p>

func main() {
    ws := func(this js.Value, inputs []js.Value) interface{} {
        go func() {
            wsDial, r, err := websocket.DefaultDialer.Dial("ws://localhost:3000/ws", nil)
            fmt.Println(wsDial, r, err)
        }()
        return nil
    }

    js.Global().Set("ws", js.FuncOf(ws))

    select {}
}


2 commentaires

Vous devriez jeter un œil à l'exemple de client: github.com/ gorilla / websocket / blob / master / examples / echo /…


@ newplayer65 Merci, mais je sais comment implémenter le client, comme vous pouvez le voir, je fais la même chose qu'à la ligne 32 dans l'exemple. En fait, il ne s'agit pas de bibliothèque, mais plutôt de go and wasm.


3 Réponses :


1
votes

Jetez un œil à la bibliothèque gopherJS websocket . Celui-ci a été créé pour fonctionner dans le navigateur (à l'origine js).

J'ai récemment vu une vidéo youtube en cours d'utilisation dans WASM, mais je ne l'ai plus trouvée.


4 commentaires

J'ai jeté un coup d'œil dessus, assez intéressant. Avez-vous une idée de la différence entre gopherjs / js et syscall / js, lequel est le mieux adapté pour wasm, d'après la documentation, il semble que syscall / js est


gopherjs et wasm support pour go sont tous deux créés par Richard Musiol . syscall / js est ajusté pour wasm donc j'utiliserais celui-là.


@tehspinx oui, et aussi après quelques recherches, j'ai appris que gopher / js est en train de mourir, alors oui, syscall / js serait le choix rationnel


ouais ... pourquoi compiler en js si vous pouvez compiler en wasm: D



4
votes

Je l'ai résolu en récupérant l'objet WebSocket de l'objet global JavaScript , qui dans mon cas est window car j'exécute ceci dans un navigateur. Je n'ai utilisé que la bibliothèque "syscall / js". Cela ressemble à ceci:

ws := js.Global().Get("WebSocket").New("ws://localhost:8080/ws")

ws.Call("addEventListener", "open", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
    fmt.Println("open")

    ws.Call("send", js.TypedArrayOf([]byte{123}))
    return nil
}))


2 commentaires

Cela semble être correct car il devrait être impossible de créer un objet WebSocket dans WASM. Pour le vous devez appeler à l'extérieur et c'est ce que vous faites.


note rapide, js.TypedArrayOf n'existe plus. vous pouvez simplement envoyer une chaîne dans ws.Call ("envoyer", "message")



1
votes

gorilla / websocket ne prend pas en charge l'assemblage Web. J'ai fini par utiliser nhooyr / websocket qui prend en charge le wasm.


1 commentaires

Avez-vous un exemple de client travaillant avec nhooyr / websocket dans wasm?