【问题标题】:XMLHttpRequest java javascriptXMLHttpRequest java javascript
【发布时间】:2012-07-17 20:40:41
【问题描述】:

我尝试在 javascript 和 java 之间进行通信。我的脚本 javascript 向 java 发送消息,java 发送响应。

javascript部分:

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4)
        {
        alert(xmlhttp.responseText);
        }
      }
    var s = "LIGNE \n 2 \n il fait beau \nEND\n";
    xmlhttp.open("POST","http://localhost:6020",true);
    xmlhttp.send(s);

java部分:

    try {
        serverSocket = new ServerSocket(6020);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 6020.");
        System.exit(-1);
    }
    serverSocket.accept()
    BufferedReader br = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
    BufferedWriter bw =  new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream()));
    String ligne = "";
    while(!(ligne = plec.readLine()).equals("END")){
        System.out.println(ligne);
    }
    bw.write("Il fait beau\n");
    bw.flush();
    bw.close();
    plec.close();
    socket.close();

输出java:

POST / HTTP/1.1
Host: localhost:6020
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost:8080/test.html
Content-Length: 30
Content-Type: text/plain; charset=UTF-8
Origin: http://localhost:8080
Pragma: no-cache
Cache-Control: no-cache

LIGNE 
 2 
 il fait beau 

所以,我正确收到了 javascript 发送的消息,但他的警报总是空的。如何回复此消息? 我尝试了很多可能性,但它们不起作用。而且我不想使用 servlet,这样做太重了。

谢谢。

编辑:

我这样做了:

bw.write("HTTP/1.1 200 OK\r\n"+
        "Content-Type: text/html; charset=utf-8\r\n"+
        "Content-Length: 13\r\n\r\n" +
        "il fait beau\n");

还有这个:

String data = "il fait beau \n";

StringBuilder builder = new StringBuilder();

builder.append("HTTP/1.1 200 OK\r\n");
builder.append("Content-Type: text/html; charset=utf-8\r\n");
builder.append("Content-Length:" + data.length() + "\r\n\r\n");
builder.append(data);
bw.write(builder.toString());

但警报仍然是空的。可能是javascript的问题。

【问题讨论】:

  • @DarkXphenomenon 我正在编辑我的帖子。
  • 更新您问题的 output java : 部分,以显示您发送新请求时会发生什么。
  • @DarkXphenomenon 输出没有改变。
  • 尝试在浏览器中打开http://localhost:6020,进行调试。如果您的响应正确,您应该会看到浏览器中显示的文本。您还可以在 firefox 中使用 LiveHttpHeaders 插件调试响应此外,请注意对我的答案的编辑。将content-type 更改为text/plain
  • content-type 应该不是问题...

标签: java javascript xmlhttprequest


【解决方案1】:

javascript 需要查看完整的 HTTP 响应。仅仅向它发送回字符,它就会丢弃回复,因为它是一个无效的 HTTP 响应。

在您的 java 代码中,发回类似这样的内容

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: <length of data>

---data here---

Reference

类似:

StringBuilder builder = new StringBuilder();
builder.append("HTTP/1.1 200 OK\r\n");
builder.append("Content-Type: text/plain; charset=utf-8\r\n");
builder.append("Content-Length:" + data.length() + "\r\n\r\n);
builder.append(data);
bw.write(builder.toString());

【讨论】:

  • 如何构建完整的 HTTP 响应?
  • 您至少需要添加HTTP/1.1 200 OK,因为只有这样,JavaScript 中的readyState==4Content-Length 才能回复您。 (或者你发送一个分块的响应,但我想这对你来说太复杂了。)
  • @Birk 什么是分块响应?
  • 如果您发送Content-Length,您必须先知道回复的长度。如果你以前不知道,你可以使用Content-Transfer-Encoding: chunked (en.wikipedia.org/wiki/Chunked_transfer_encoding)
【解决方案2】:

试试:

bw.write("HTTP/1.1 200 OK\r\n"+
            "Content-Type: text/html; charset=utf-8\r\n"+
            "Content-Length: 13\r\n\r\n" +
            "il fait beau\n");

HTTP-Header 由 \r\n (CRLF) 分隔。标题和正文由\r\n\r\n 分隔。

请注意,您将长度设置为 13,因为您还必须计算字符串末尾的 \n

编辑:由于跨域策略,它不起作用http://localhost:6020 与执行 JavaScript 的网站的端口不同,因此可能无法传递 xmlhttprequest。

【讨论】:

  • 谢谢,但警报中始终没有任何内容。
  • 对不起,我的代码中目前有Content-Length: 13\r\n\r\n+。删除+。这是一个打字错误。我在我的例子中改变了它。那么它应该可以工作了。
  • 这不是问题,我删除它但总是没有。
  • +1 :D 我没想到! @AnthonyMaia,您正在执行 XMLHttp 请求的站点是否也在 localhost 上?
  • 另外,如果是,它不可能是同一个端口,因为他的 Java 程序已经在使用它。我也找不到它不应该工作的另一个原因。但我一开始也没有想到^^
猜你喜欢
  • 2011-03-26
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2018-09-11
  • 2014-09-02
  • 2014-07-13
相关资源
最近更新 更多