Skip to content

Instantly share code, notes, and snippets.

@JeanRibes
Last active May 6, 2021 22:25
Show Gist options
  • Save JeanRibes/d34a04df9745cca0134e4414f9f0610a to your computer and use it in GitHub Desktop.
Save JeanRibes/d34a04df9745cca0134e4414f9f0610a to your computer and use it in GitHub Desktop.
websocket duplication

Utilisé pour partager un affichage GTK+ Broadway vers plusieurs personnes (par défaut un seul client)

broadwayd :0 & # lance le serveur Broadway, disponible à 127.0.0.1:8080

ensuite, se connecter sur http://ip-server:8082

On peut maintenant ouvrir des applications GTK dans Broadway

les clients doivent être connectés avant d'ouvir une appli, sinon ils ne la voient pas

GDK_BACKEND=broadway BROADWAY_DISPLAY=:0 nautilus
package main
import (
"container/list"
"flag"
"fmt"
"github.com/gorilla/websocket"
"io"
"net/http"
"os"
"sync"
)
var httpToWs = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {
return true
}}
//var clients = []*websocket.Conn{}
var clients = list.New()
var broadwayServer *websocket.Conn
var broadwayLock sync.Mutex
var broadway_addr = flag.String("broadway-addr","127.0.0.1:8080", "address of the Broadway display server, in the form of ip:port")
var listen_addr = flag.String("listen-addr",":8090","address to listen on, ip:port")
func he(err error) {
if err != nil {
panic(err)
}
}
func connectBroadway() *websocket.Conn {
dialer := websocket.DefaultDialer
dialer.Subprotocols = []string{"broadway"}
header := http.Header{}
header.Set("Origin", "http://"+*broadway_addr)
conn, r, err := dialer.Dial("ws://"+*broadway_addr+"/socket", header)
he(err)
if r != nil {
fmt.Printf("status %s\n", r.Status)
if r.StatusCode == 400 {
r.Write(os.Stdout)
os.Exit(1)
}
}
if conn == nil {
panic(err)
os.Exit(1)
}
return conn
}
func handleWs(w http.ResponseWriter, r *http.Request) {
conn, err := httpToWs.Upgrade(w, r, nil)
he(err)
var el *list.Element
if conn != nil {
//clients = append(clients, conn)
el=clients.PushBack(conn)
}
fmt.Printf("client %s connected\n",conn.RemoteAddr().String())
for {
msg, msgtype, err1 := conn.ReadMessage()
if err1 != nil {
break
}
broadwayLock.Lock()
if broadwayServer.WriteMessage(msg, msgtype) != nil {
broadwayLock.Unlock()
break
}
broadwayLock.Unlock()
}
fmt.Printf("client %s: disconnected\n",conn.RemoteAddr().String())
clients.Remove(el)
}
func broadwayDispatchLoop() {
for {
msg, msgtype, err2 := broadwayServer.ReadMessage()
he(err2)
for e := clients.Front(); e != nil; e = e.Next() {
client:=e.Value.(*websocket.Conn)
if client != nil {
err3 := client.WriteMessage(msg, msgtype)
if err3!=nil{
fmt.Println(err3)
clients.Remove(e)
}
}
}
}
}
func main() {
flag.Parse()
broadwayServer = connectBroadway()
go broadwayDispatchLoop()
http.HandleFunc("/socket", handleWs)
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
res, err := http.Get("http://"+*broadway_addr+"/")
he(err)
writer.Header().Set("Content-Type", res.Header.Get("Content-Type"))
io.Copy(writer, res.Body)
})
http.HandleFunc("/broadway.js", func(writer http.ResponseWriter, request *http.Request) {
res, err := http.Get("http://"+*broadway_addr+"/broadway.js")
he(err)
writer.Header().Set("Content-Type", res.Header.Get("Content-Type"))
io.Copy(writer, res.Body)
})
http.HandleFunc("/count", func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintf(writer, "%d clients connected", clients.Len())
})
http.ListenAndServe(*listen_addr, nil)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment