在浏览器关闭时关闭Go服务器

时间:2018-06-04 18:32:00

标签: go shutdown

我在Go中编写了一个小型支票簿分类帐,作为在localhost中运行的服务器,并将默认浏览器打开到一个小型Web应用程序前端(https://bitbucket.org/grkuntzmd/checks-and-balances)。

要在浏览器选项卡关闭时自动关闭服务器,我会让浏览器每隔几秒钟调用一次“心跳”URL。如果该心跳未到达,则服务器使用(*Server) Shutdown停止运行。

有没有办法使用上下文(https://golang.org/pkg/context/)做同样的事情?根据JustForFunc的this一集,我的理解是,如果客户取消请求,将通知传递给处理程序的上下文。

2 个答案:

答案 0 :(得分:3)

而不是发送"心跳"经常请求,您可以利用server-sent events

服务器发送事件是一种Web技术,浏览器发出HTTP请求并保持连接打开以从服务器接收事件。这可以通过在关闭事件源的连接时关闭服务器来替代重复心跳请求的需要。

这是Go中的基本服务器实现:

MATCH (s)-[*0..1]->(p:Address)
WHERE s:Some OR s:Some2
RETURN p;

有关客户端的指南,请参阅using server-sent events

答案 1 :(得分:2)

从页面打开websocket连接。在服务器上,关闭websocket连接时退出:

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer c.Close()

    // Shutdown on exit from handler
    defer server.Shutdown(context.Background())

    // Read  messages from client. NextReader returns an error
    // when the client shuts down.
    for {
        if _, _, err := c.NextReader(); err != nil {
            break
        }
    }
 }

将此行代码添加到客户端应用程序:

 var conn = new WebSocket("ws://" + document.location.host + "/ws");

确保conn具有页面的生命周期。

这有点类似于另一个答案中建议的SSE解决方案,但具有在更多浏览器中工作的优势。

没有必要发送心跳,因为这是在本地主机上。