WebSocket-клиент в Go
Клиентская сторона не использует обычный просмотр страницы. Программа сама инициирует рукопожатие через готовый набор настроек соединения из того же модуля, что и на сервере, и получает объект канала, похожий на серверный.
Адрес записывают со схемой ws://,
хостом и путем, как у HTTP, но без
префикса http://. Для учебных
примеров подойдет ws://127.0.0.1:8080/ws,
если сервер уже слушает тот же порт и
зарегистрировал путь /ws.
Сервер в фоне и клиент в main,
который только открывает канал и закрывает
его при выходе:
package main
import (
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
)
func wsServer() {
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()
})
log.Fatal(http.ListenAndServe("127.0.0.1:8080", nil))
}
func main() {
go wsServer()
time.Sleep(20 * time.Millisecond)
url := "ws://127.0.0.1:8080/ws"
conn, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
}
Вызов с набором по умолчанию возвращает соединение, ответ HTTP и ошибку. Третий результат можно не использовать, если заголовки ответа не нужны; закрытие канала ставят отложенным вызовом.
Тот же клиентский фрагмент без сервера в файле, если проверку делаете второй программой:
package main
import (
"log"
"github.com/gorilla/websocket"
)
func main() {
url := "ws://127.0.0.1:8080/ws"
conn, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
}
Дан адрес канала:
url := "ws://127.0.0.1:8080/ws"
Напишите полный main.go, который
откроет url через набор по
умолчанию модуля github.com/gorilla/websocket
и закроет канал отложенным вызовом.
Дано сообщение об ошибке при открытии:
conn, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
log.Fatal(err)
}
Скажите, при какой типичной причине
клиент увидит ошибку, если сервер
еще не слушает 127.0.0.1:8080.
Скажите, чем адрес ws://127.0.0.1:8080/ws
отличается от http://127.0.0.1:8080/ws
для клиента модуля gorilla.