Java Socket HTML响应

5
我是一个有用的助手,可以为您翻译文本。

我正在尝试让Java套接字向浏览器发送简单的HTML响应。

这是我的Java代码:

    Socket socket = server.accept();
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String s;
    // this is a test code which just reads in everything the requester sends
    while ((s = in.readLine()) != null)
    {
        System.out.println(s);
        if (s.isEmpty())
        {
            break;
        }
    }
    // send the response to close the tab/window
    String response = "<script type=\"text/javascript\">window.close();</script>";

    PrintWriter out = new PrintWriter(socket.getOutputStream());
    out.println("HTTP/1.1 200 OK");
    out.println("Content-Type: text/html");
    out.println("Content-Length: " + response.length());
    out.println();
    out.println(response);
    out.flush();
    out.close();
    socket.close();

server是一个ServerSocket,它会自动选择一个空闲的端口来使用。

这个想法是将任何重定向到http:\\localhost:port(其中portserver正在监听的端口)的网页自动关闭。

当运行此代码时,我的浏览器接收到响应,并且我已经验证它接收到了我发送的所有信息。

然而,窗口/选项卡并没有关闭,我甚至无法通过在我的浏览器的Javascript控制台中手动发出window.close();命令来关闭选项卡。

我错过了什么?我知道具有给定内容的html页面应该自动关闭窗口/选项卡,那么为什么不起作用?我是在Google Chrome上测试的。

我尝试了更完整的html网页,但仍然没有运气。

以下是浏览器报告的页面源代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript">window.close();</script>
</head>
<body>
</body>
</html>

1
在控制台中使用window.close()对我有效。尝试将其包装在<html><head>中。 - John Dvorak
尝试使用self.close()。此外,我看到了这个线程:http://productforums.google.com/forum/#!topic/chrome/GjsCrvPYGlA。我正在使用IE,但是在浏览器中window.close()对我无效。然而,我尝试了self.close(),它起作用了。 - Philip Tenn
似乎window.close()在本地机器上无法工作。 - John Dvorak
我无法在通过 file:// 协议打开的页面中调用 window.close()(返回无效),即使是从控制台也不行。 - John Dvorak
2
这可能会解释window.close的问题:https://dev59.com/PHI-5IYBdhLWcg3wED9V。我改成了<script type="text/javascript">window.open('', '_self', '');window.close();</script>,现在可以正常工作了。 - tjg184
显示剩余4条评论
1个回答

0

总结评论:

根本问题实际上是在这里发现的,其中window.close()无法关闭当前窗口/选项卡。

我查阅了MDN文档并找到了以下内容:

调用此方法时,引用的窗口将被关闭。

此方法仅允许为使用window.open方法通过脚本打开的窗口调用。如果窗口未由脚本打开,则JavaScript控制台中会出现以下错误:脚本可能无法关闭未由脚本打开的窗口。

显然,Google Chrome认为当前窗口不是由脚本打开的。我还在Firefox中尝试了这个方法,结果表现相同。

为了解决这个问题,我必须先使用脚本打开当前窗口。

<script type="text/javascript">
    window.open('', '_self', '');
    window.close();
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接