Как да получите достъп до други клиентски връзки от Go WebSocket манипулатор?

Забележка: По-скоро се интересувам от разбирането на общи концепции/модели на Go, отколкото от решаването на този измислен пример.

Пакетът Go (golang) WebSocket предоставя тривиален пример за ехо сървър, който се свежда до нещо като този:

func EchoServer(ws *websocket.Conn) { io.Copy(ws, ws); }

func main() {
 http.Handle("/echo", websocket.Handler(EchoServer));
 http.ListenAndServe(":12345", nil);
}

Сървърът обработва едновременни връзки и се опитвам да го надстроя до основен сървър за чат, като повторя въвеждането на всички свързани клиенти.

Как да осигуря достъп на манипулатора на EchoServer до всяка от отворените връзки?


person Paul Annesley    schedule 25.08.2010    source източник


Отговори (1)


Един бърз малък почти функционален пример, за да ви даде представа

var c = make(chan *websocket.Conn, 5) //5 is an arbitrary buffer size
var c2 = make(chan []byte, 5)
func EchoServer(ws *websocket.Conn) {
    buff := make([]byte, 256)
    c <- ws
    for size, e := ws.Read(buff); e == nil; size, e = ws.Read(buff) {
        c2 <- buff[0:size]
    }
    ws.Close()
}
func main() {
    go func() {
        var somekindofstorage
        for {
            select {
            case newC := <-c:
                somekindofstorage.Add(newC)
            case msg := <-c2:
                for _, v := range somekindofstorage {
                    if _, e := v.Write(msg); e != nil { //assuming the client disconnected on write errors
                        somekindofstorage.Remove(v)
                    }
                }
            }
        }
    }()
    http.Handle("/echo", websocket.Handler(EchoServer));
    http.ListenAndServe(":12345", nil);
}

Това стартира goroutine, която слуша на два канала, един за нови връзки за добавяне и един за съобщения за изпращане до всички активни връзки. somekindofstorage може да бъде карта или вектор.

Редактиране:

Като алтернатива можете просто да съхраните всички връзки в глобална карта и да пишете на всяка от EchoServer. Но картите не са предназначени за едновременен достъп.

person cthom06    schedule 25.08.2010
comment
Браво, благодаря. Бих гласувал за вашия отговор, ако ми беше позволено. Като се прибера ще го разгледам по-подробно. наздраве! - person Paul Annesley; 26.08.2010