我在将我的 WebSocket 服务器放入 Docker 容器时遇到了问题。
这是服务器代码,它使用“connected”写入新连接。
// server.go
func RootHandler(w http.ResponseWriter, r *http.Request) {
upgrader := websocket.Upgrader{ // (Uses gorilla/websocket)
ReadBufferSize: 4096,
WriteBufferSize: 4096,
}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
}
if err = conn.WriteMessage(websocket.TextMessage, []byte("connected")); err != nil {
panic(err)
}
}
func main() {
fmt.Println("server is running")
// For graceful shutdown
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
server := http.Server{Addr: "localhost:8000"}
defer server.Close()
http.HandleFunc("/", RootHandler)
go func() {
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
panic(err)
}
}()
<-stop
}
这是客户端:
// client.go
func main() {
connection, _, err := websocket.DefaultDialer.Dial("ws://localhost:8000", nil)
if err != nil {
panic(err)
}
_, b, err := connection.ReadMessage()
if err != nil {
panic(err)
}
fmt.Println(string(b)) // "connected"
}
运行server.go然后client.go打印“已连接”,表明代码正在运行。现在我想把服务器放在一个 Docker 容器中。这是dockerfile:
FROM golang:1.11.4-alpine3.8
COPY . $GOPATH/src/websocket-test
WORKDIR $GOPATH/src/websocket-test
RUN ["go", "build", "server.go"]
EXPOSE 8000
CMD ["./server"]
我使用这些命令来构建和启动容器,暴露 8000/tcp。
docker build -t websocket-test .
docker run -p 8000:8000 websocket-test
我可以确认服务器正在运行,因为它打印“服务器正在运行”。如果我client.go从容器外开始,它会恐慌:
panic: read tcp [::1]:60328->[::1]:8000: read: connection reset by peer
我期望的是与以前相同的结果——在客户端打印“connected”。错误消息意味着服务器在握手之前断开了连接。我不明白“60328”这个数字。据我所知,WebSocket 不会在升级时更改端口,所以我应该可以只公开 8000。
我不知道我必须更改什么才能通过 WebSocket 连接到我的服务器。
杨魅力
相关分类