【问题标题】:receive multiple responses in javascript with one request通过一个请求在 javascript 中接收多个响应
【发布时间】:2015-10-15 01:15:21
【问题描述】:

如何使用 javascript 从服务器接收多个响应。

我有一个要求,其中一次发布请求,其中包含数据和迭代次数,并且在服务器端处理请求的迭代次数。每次迭代完成后,服务器发回响应。因此,对于一个请求和 10 次迭代,我的 java 脚本需要接收 10 个响应并将其显示在网页上。有什么方法可以使用 javascript 来处理这个问题。我不能使用任何其他技术。

我现在正在使用以下方式

    function showResponse(){
    xmlHttp = GetXmlHttpObject();
    var dataString = document.getElementById("request-parameters").value;
    var iterations = document.getElementById("iterations").value;
    if(xmlHttp==null){
        alert("your browser does not support AJAX!");
    }
    var url = "http://localhost:8080/servlet/requestServlet";

    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("POST",url,true);
    xmlHttp.send(dataString);
}

function GetXmlHttpObject(){
    var xmlHttp=null;
    try{
        //Firefox, Opera, Safari
        xmlHttp=new XMLHttpRequest();
    }catch(e){
        //IE
        try{
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

function stateChanged(){
    if(xmlHttp.readyState==4){

        if(xmlHttp.status == 200){
             var resp = xmlHttp.responseText;
             var responseDiv = document.getElementById("response");
            responseDiv.innerHTML=responseDiv.innerHTML+resp1[1];

            }
    }
}

我无法修改这种方法。是否可以使用 XmlHttp 对象完成它。

【问题讨论】:

  • 您的服务器端技术是什么?对于 .NET,您所追求的是 SignalR
  • @Jamiec 我正在使用 java servlets
  • 我已经适当地标记了您的问题 - 这将帮助您获得更好的答案,因为更了解 Java 及其相关库/框架的人会被这个问题所吸引。

标签: javascript java websocket


【解决方案1】:

仅使用“基本 javascript”您无法做到这一点。

它的工作原理是这样的:客户端发送请求,服务器返回“某物”。出于多种原因,服务器不能简单地将数据发送回该客户端。答:除了请求的第一次“调用”外,双方之间没有“链接”即连接,但客户端只是等待响应。 B: 脚本不期望得到其他答案。

例如,您需要一个 websocket。这样,客户端可以监听服务器并实际处理从服务器发送到客户端的数据。

简而言之:

Javascript 总是这样工作:

客户端 -> 服务器 |并且服务器响应

对于套接字,您可以:

客户端 -> 服务器 服务器 -> 客户端

你可以使用某种“javascript”,即使它是一种不同的技术……比如 NodeJS。

另一种方法是循环。无需发布具有大量迭代的数据集,只需在 JS 中对其进行迭代,然后每次迭代将其发送到服务器以实际“执行”您的数据。

【讨论】:

  • 这是不正确。 websocket API 是标准 javascript 库的一部分,因此您可以使用 Javascript 执行此操作。确实,Websockets 也应该由服务器支持和实现(NodeJS 只是 websocket 处理的一个选项)......但是它是可能的
【解决方案2】:

1) HTTP 向一个控制器尝试一次请求,然后从其他控制器获取答案,您可以使用 jQuery 或本机 XmlHttpRequest 执行此操作(它不是一个请求)。

 $.get("server/controllerJob",{data:"data"});
 var askInterval = window.setInterval(function(){
         $.get("server/askAnswerFromJob",{data:"data"}).done(function( data ) {
          if(data.complete){
                /** do staff**/
               window.clearInterval(askInterval);
          }else{
             /** do staff**/
          }
      });
    },200);

2) webSocket 或者尝试查找有关WebSocket webSocket documentation 的东西,它是一个连接多个请求和响应的技术(全双工连接流)。

另外你还需要其他的服务器控制器实现看websocket supported browsers

注意 ws:.这是 WebSocket 连接的新 URL 模式。 还有 wss: 用于与 https 相同的安全 WebSocket 连接: 用于安全的 HTTP 连接

我只是注意到附带的“示例”网络应用程序 Tomcat 7 包含 4 个完整的如何使用 WebSocket 的例子(针对 java 开发者)

var connection = new WebSocket('ws://server/yourService',['soap','xmpp']);  

    connection.onopen = function () {
      connection.send('ask'); // Send the message to server
    };

     //Each time on new messages from server, this callbacks will be executed (depends on result)

    // Log errors from server
    connection.onerror = function (error) {
      console.log('WebSocket Error ' + error);
    };

    // Get messages from the server
    connection.onmessage = function (e) {
      console.log('Answer: ' + e.data);
    };

【讨论】:

  • 感谢您的回复。由于 ajax 调用已经用 XmlHttpRequest 实现,我不能使用 jquery 或其他东西。您能否指导我如何通过 XmlHttpRequest 实现。我编辑了我的问题并添加了 ajax 调用。在服务器端,我使用 java servlets
  • 您已经完成了将数据发送到服务器并接收响应的功能。创建更常见的功能,如“sendRequest(url,data,callback)”并将其与间隔一起使用。
  • 我无法一次又一次地发送数据。所以我不能使用间隔(定时器)来发送数据。我需要使用迭代次数发送一次数据。我尝试了您提供的 Web 套接字代码,但我收到“Firefox 无法在 ws://localhost:8080/servlet/requestServlet 建立与服务器的连接”我试图打印错误但我收到“[object Event ]"
  • 看,这对你有帮助吗coderanch.com/t/633446/Tomcat/…
  • 用于控制台 (js) 中的打印对象 - 使用 console.dir(whatEverYouWant)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2022-11-20
  • 2011-01-22
  • 2020-01-28
  • 1970-01-01
相关资源
最近更新 更多