douxuanjie2692 2018-04-07 05:11
浏览 24
已采纳

客户端重新加载页面时如何解决服务器故障?

When the client reloads the page, the server issues an error - websocket: close 1001 (going away). When the client reloads the page, does not the websocket connection reconnect? I recently started studying programming, so please forgive if the question is stupid. Client code

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);
}

I'm using the gorilla websocket library to build a connection.

Server code

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)
    }
 }
}
  • 写回答

2条回答 默认 最新

  • drfals1307 2018-04-07 05:41
    关注

    In go, log.Fatal(..) exits your application.

    err := conn.ReadJSON(&query)
    

    will return an err when the client connection closes and the next block:

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

    will close the go server and the Javascript client will be unable to reconnect.

    Your server structure also doesn't look quite correct - WebSocketHandler is invoked to handle a single connection:

        .
        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 --
            .
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀