【问题标题】:Can't receive in javascript XMLHttpRequest response from java server无法在 javascript XMLHttpRequest 中接收来自 java 服务器的响应
【发布时间】:2017-01-02 17:25:29
【问题描述】:

这是我的 javascript 代码

    <script type="text/javascript">
startingListener();
function startingListener() {
  setInterval(function(){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://localhost:32081/", false);
    xhr.send();           
       var result = xhr.response;
       console.log(result);
     }
  }, 100);
}
</script>

还有我在 Java 上的服务器

public static void main (String... args) throws IOException, Exception {
String clientSentence;
     ServerSocket welcomeSocket = new ServerSocket(32081);

     while(true)
     {
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient =
           new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        PrintWriter outToClient = new PrintWriter(connectionSocket.getOutputStream(), true);

        clientSentence = inFromClient.readLine();
        System.out.println("Received: " + clientSentence);
             System.out.println("begin");   
             outToClient.println("fu");
             System.out.println("Received: done");

     }
}

我只想在 JS 中接收答案字符串并进一步使用它。

所以当我运行服务器并运行 JS 时,它们已连接,并且我在 IDE 中从 JS 接收到 send()

之后,我在 Java 控制台中看到 begin 和 done 收到,但在浏览器控制台中我没有看到任何答案和脚本刚刚处理。我做错了什么?

感谢您的帮助

【问题讨论】:

  • 您在浏览器中根本没有收到任何警报?您是否收到任何浏览器开发人员工具控制台错误?您确定要每秒发送 10 个同步请求吗? http://localhost:32081/ 与网页的来源相同吗?严重的是,浏览器控制台中是否有任何错误?
  • 我看不到您的 server 是如何创建浏览器需要的 Http 响应的。
  • @ScaryWombat - 这不是outToClient.println 会做的吗? (我假设,我对 java 一无所知) - 虽然,重新阅读代码,我明白你的意思......根本没有 http,有没有
  • 没有错误,什么都没有。控制台刚刚清洁。我认为只是因为我发送了同步请求。
  • 不是普通的普通插座。没有 Http 响应标头或任何东西。怎么会有200的状态?

标签: javascript java xmlhttprequest tcpserver


【解决方案1】:

您的客户端代码缺少状态更改处理程序,并且使用 100 毫秒的 setInterval 对服务器来说非常繁重。这是一个更好的JS。您的 JAVA 问题是另一个问题。反对者:发表评论

function listener() {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://localhost:32081/", false);
  xhr.onreadystatechange = function () {
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
        console.log(xhr.responseText);
    }
  }
}

listener();

如果你想重复调用监听器,你可以这样做

function listener() {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://localhost:32081/", false);
  xhr.onreadystatechange = function () {
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
        if (xhr.responseText != "done") {
          console.log("server still busy");
          setTimeout(listener,1000); // repeat the call
        }
        else {
          console.log("finally done");
        }
    }
  }
}

【讨论】:

  • 不是DV,但是,在服务器代码中的哪里生成了任何Http?怎么会有200的状态?
  • 那是另一个问题。我只处理了 JS :)
  • 谢谢,但我对服务器端真的很感兴趣。因为 JS 端不是我写的,并且非常适合 C# 代码,我看不到。
  • 当然。但是你有两个问题。我修好了一个
  • 反对票是怎么回事?如果您有话要说,请发表评论。除非设置了 readystatechange 处理程序,否则 OP 不会看到任何结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多