WebSocket-сервер в Go
Серверная сторона опирается на уже знакомый
пакет net/http. Сначала слушают
локальный адрес, как для обычных страниц;
отдельный путь получает функцию, которая
не пишет HTML, а переводит запрос в
долгоживущее соединение библиотеки.
Для перевода создают значение типа
websocket.Upgrader с настройками
по умолчанию. Его метод принимает объект
ответа, запрос и необязательные заголовки;
при успехе возвращают объект соединения,
с которым дальше работают в том же
обработчике или в горутине.
Минимальный сервер на 127.0.0.1:8080
с путем /ws и переводом без обмена
текстом:
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
func main() {
upgrader := websocket.Upgrader{}
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
})
if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
log.Fatal(err)
}
}
Пока обработчик только принимает связь и сразу закрывает ее при выходе. Ошибку перевода печатают и выходят из функции, не ломая весь процесс прослушивания.
Тот же каркас с явной переменной обновляющего объекта перед регистрацией пути:
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
}
func main() {
http.HandleFunc("/ws", wsHandler)
log.Fatal(http.ListenAndServe("127.0.0.1:8080", nil))
}
Дан путь:
path := "/ws"
Напишите полный main.go: зарегистрируйте
path на прослушивании
127.0.0.1:8080 и в обработчике
переведите запрос в канал сообщений
модуля github.com/gorilla/websocket.
Дан фрагмент после успешного перевода:
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
Допишите отложенное закрытие conn
и скажите, почему его ставят до длинной
работы с сообщениями.
Скажите, чем обработчик пути /ws
отличается от обработчика, который
просто печатает текст "ok"
в ответ HTTP.