GO 中的长时间轮询,服务器响应不当

Long Polling in GO, Server Not Responding Appropriately?

本文关键字:服务器 响应 长时间 GO      更新时间:2023-09-26

我正在尝试实现一个简单的"全局"计数器,该计数器会根据单击浏览器按钮上的每个用户进行更新。例如,如果您转到该网站并单击按钮,如果我在同一网站上,我会看到计数器增加。我试图通过长时间的民意调查来做到这一点,但面临一些问题。主要是服务器变量没有像我认为的那样返回。

服务器:

package main
import (
    "net/http"
    "log"
    "io"
    "io/ioutil"
)
var messages chan string = make(chan string, 100)
var counter = 0
func PushHandler(w http.ResponseWriter, req *http.Request) {
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        w.WriteHeader(400)
    }
    counter += 1
    messages <- string(counter)
}

func PollResponse(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, <-messages)
}
func main() {
    http.Handle("/", http.FileServer(http.Dir("./")))
    http.HandleFunc("/poll", PollResponse)
    http.HandleFunc("/push", PushHandler)
    err := http.ListenAndServe(":8005", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

客户端:

<html>
<script language=javascript>
function longpoll(url, callback) {
    var req = new XMLHttpRequest (); 
    req.open ('GET', url, true); 
    req.onreadystatechange = function (aEvt) {
        if (req.readyState == 4) { 
            if (req.status == 200) {
                callback(req.responseText);
                longpoll(url, callback);
            } else {
                alert ("long-poll connection lost");
            }
        }
    };
    req.send(null);
}
function recv(msg) {
    var box = document.getElementById("counter");
    box.value += msg + "'n";
}
function send() {

    var box = document.getElementById("counter");
  var req = new XMLHttpRequest (); 
    req.open ('POST', "/push?rcpt=", true); 
    req.onreadystatechange = function (aEvt) {
        if (req.readyState == 4) { 
            if (req.status == 200) {
            } else {
                alert ("failed to send!");
            }
        }
  };
  req.send("hi")
  //box.innerHTML += "test" ;  
}
</script>
<body onload="longpoll('/poll', recv);">
<h1> Long-Poll Chat Demo </h1>
<p id="counter"></p>
<button onclick="send()" id="test">Test Button</button>
</body>
</html>

由于某种原因,计数器变量未从服务器返回。我相信每次单击按钮时我都会更改状态,因此长轮询函数应该获取新更新的计数器变量。如果您有任何建议,请告诉我!

我在你们的程序中看到了两个问题:1. 在服务器中:

messages <- string(counter)

你应该使用"strconv"包

messages <- strconv.Itoa(counter)

string(0) 将返回类似 []byte{0} 而不是"0"
的内容2. 在您的客户中:

function recv(msg) {
    var box = document.getElementById("counter");
    box.value += msg + "'n";
}

应该是:

function recv(msg) {
    var box = document.getElementById("counter");
    box.innerHTML += msg + "'n";
}

我不认为p元素具有属性