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

Posted

技术标签:

【中文标题】客户端重新加载页面时如何修复服务器故障?【英文标题】:How to fix a server failure when the client reloads the page? 【发布时间】:2018-04-07 05:11:23 【问题描述】:

当客户端重新加载页面时,服务器发出错误- 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)
    
 

【问题讨论】:

【参考方案1】:

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

err := conn.ReadJSON(&query)

将在客户端连接关闭和下一个块时返回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 --
        .
    

【讨论】:

【参考方案2】:

如果页面加载 websocket 连接,那么就不用担心了。当页面刷新时,客户端将连接到服务器。您可以忽略 websocket close 1001 的异常。

【讨论】:

以上是关于客户端重新加载页面时如何修复服务器故障?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Express 重新加载页面?

几个常见网络故障修复命令

CentOS 7中修复GRUB菜单故障实验

保持 wcf 回调通道无限期打开/如果出现故障则从客户端重新连接

CentOS 7中修复GRUB菜单故障实验

Linux系统启动流程之系统故障修复之二