5

単純なHTML応答をブラウザに送信するためのJavaソケットを取得しようとしています。

これが私の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です。

アイデアは、リダイレクトされたWebページhttp:\\localhost:portportポートserverがリッスンしている場所)が自動的に閉じられることです。

このコードが実行されると、ブラウザーが応答を受信し、送信するすべての情報をブラウザーが受信することを確認しました。

window.close();ただし、ウィンドウ/タブが閉じておらず、ブラウザのJavascriptコンソールに手動でコマンドを発行してタブを閉じることもできません。

ここで何が欠けていますか?指定されたコンテンツを含むhtmlページがウィンドウ/タブを自動的に閉じる必要があることを知っていますが、なぜこれが機能しないのですか?私はこれをGoogleChromeでテストしています。

より完全なhtmlWebページを試しましたが、それでもうまくいきません。

ブラウザがページソースとして報告しているものは次のとおりです。

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

1 に答える 1

0

コメントを要約すると:

根本的な問題は、実際にはここで見つかった問題であり、window.close()は現在のウィンドウ/タブを閉じません。

MDNドキュメントを調べたところ、次のことがわかりました。

このメソッドが呼び出されると、参照されているウィンドウが閉じられます。

このメソッドは、window.openメソッドを使用してスクリプトによって開かれたウィンドウに対してのみ呼び出すことができます。スクリプトによってウィンドウが開かれなかった場合、JavaScriptコンソールに次のエラーが表示されます。スクリプトによって開かれなかったウィンドウは、スクリプトによって閉じられない場合があります。

どうやらGoogleChromeは現在のウィンドウがスクリプトによって開かれることを考慮していなかったようです。同じ動作をするFirefoxでもこれを試しました。

これを回避するには、最初にスクリプトを使用して現在のウィンドウを開く必要があります。

<script type="text/javascript">
    window.open('', '_self', '');
    window.close();
</script>
于 2012-11-22T18:46:27.577 に答える