javascript - 客户端重新加载页面时如何修复服务器故障?

标签 javascript go websocket

当客户端重新加载页面时,服务器发出错误 - websocket:关闭 1001(离开)。 当客户端重新加载页面时,websocket 连接是否重新连接? 我最近开始学习编程,所以如果问题很愚蠢,请原谅。 客户端代码

var socket = new WebSocket("ws://localhost:8080/ws" );

socket.onmessage = function (event) {
    DownloadScene(event)
}

function DownloadScene(event) {
    var data = JSON.parse(event.data)
    document.getElementById(data.id).innerHTML = data.body;
}
function  loadScene(scene) {
  var page = {
    query_type:"loadScene",
    data : {temp:scene}
}
   var event = JSON.stringify(page);
   socket.send(event);
}

我正在使用 gorilla websocket 库来建立连接。

服务器代码

func WebSocketHandler(w http.ResponseWriter, r *http.Request) {

   conn, err := upGrader.Upgrade(w, r, nil)

   if err != nil {
      log.Println(err)
      return
   }
   for { webSocketHandler(conn)}
   defer conn.Close()
}

func webSocketHandler(conn *websocket.Conn) {

  println("new connect")
  err := conn.ReadJSON(&query)
  if err != nil {
      log.Fatal(err)
      return
  }
  switch query.QueryType {
  case "loadScene" :
    err := json.Unmarshal(query.Data,&frames)
    if err!= nil{
        log.Fatal(err)
    }
    var buf  bytes.Buffer
    data := frame.ExecuteTemplate(&buf,"frame",nil)
    if data!=nil{
        log.Fatal(data)
    }
    res,e := json.Marshal(&Frame{"scene",buf.String()})
    if e !=nil{
        log.Println(e)
    }

    errs := conn.WriteMessage(1,res)
    if err!=nil{
        log.Fatal(errs)
    }
 }
}

最佳答案

go 中,log.Fatal(..) 退出您的应用程序。

err := conn.ReadJSON(&query)

当客户端连接关闭和下一个 block 时,将返回一个err:

if err != nil {
  log.Fatal(err)
  return
}

将关闭 go 服务器,Javascript 客户端将无法重新连接。

您的服务器结构看起来也不太正确 - WebSocketHandler 被调用来处理单个连接:

    .
    http.HandleFunc("/", WebSocketHandler)
    log.Fatal(http.ListenAndServe("localhost:8080", nil))
}

func WebSocketHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Print("Error upgrading websocket:", err)
        return
    }

    defer conn.Close()

    for {
        err = conn.ReadJSON(&query)
        if err != nil {
            log.Print("Error reading query: ", err)
            return
        }
        .
        // -- process query here --
        .
    }
}

关于javascript - 客户端重新加载页面时如何修复服务器故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49704093/

相关文章:

javascript - 在 AngularJS 中使用模板和过滤

javascript - 为什么我的脚本仅在缩小后才抛出 'Cannot redefine property: i' 错误?

javascript - 你如何使用 html/javascript 逐行读取/解析文本文件?

javascript - 到特定房间的 Websocket 消息 - Golang Kataras/Iris

python - 发布到特定 channel /群组

javascript - 返回值并保留 javascript 对象的成员?

go - ajax调用后如何重定向到调用url?

go - 替代哈希来处理 Go 中的混合类型

go - 从golang中的xls文件中读取数字类型单元格

node.js - Socket.io 作为客户端进行身份验证