0

HTTPなどを調べ始めたばかりで、URLConnectionを使用してサーバーにURLを送信し、index.htmlページを(プレーンテキストとして)プルダウンする単純なJavaクライアントを作成しました。

現在、私は単純なサーバーで作業していますが、最初のハードル(おそらく2番目または3番目)で立ち往生しており、クライアントに適切に応答させることができません。

これがループ内の読み取りであり、FFやIEなどからでもHTTPリクエストを正常に読み取ります。

while((message = in.readLine()) != null)
    {
        System.out.println(message);
        out.write("something");
    }

問題は、有用なものに応答する方法がわからないことです。上記のコードで実行していることを実行させると、クライアントに「何か」を6回送信しますが(HTTP要求には6行あるため)、FF/IEなどには何も送信しません。

また、ループの後に印刷する行を追加したので、ループが壊れているようには見えませんSystem.out.println("test");が、サーバーがそのポイントに到達することはないようです。readLine()は最初のHTTPリクエストの最後にnullを返す必要がありますか?

私は太陽とオラクルのウェブサイトで何かを読んでいますが、これがどのように機能するかについてはまだかなり行き詰まっています。

御時間ありがとうございます、

Infinitifizz

編集:おっと、コードをコピーするのを忘れました。

Server.java:

package exercise2;

import java.net.*;

public class Server 
{
    public static void main(String[] args) throws Exception
    {
        boolean listening = true;
        ServerSocket server = new ServerSocket(8081);

    while(listening)
    {
        Socket client = server.accept();

        new ServerThread(client).start();
    }
        server.close();
    }
}

ServerThread.java:

package exercise2;

import java.io.*;
import java.net.*;

    public class ServerThread extends Thread 
{
    private Socket socket = null;
    public ServerThread(Socket s)
    {
        this.socket = s;
    }

    public void run()
    {
        try
        {

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                                    socket.getInputStream()));

        String message, reply = "";

        while((message = in.readLine()) != null)
        {
            System.out.println(message);
            out.write("something");
        }
            System.out.println("test");
        in.close();
        out.close();
        socket.close();
        }
        catch(IOException e)
        {
            System.err.println("error");
        }
    }
}
4

2 に答える 2

2

クライアントコードを見ずに、これは何が起こっているかについての私の最善の推測です:

クライアントがリクエストの書き込みを完了したが、接続を閉じていないため、サーバーはおそらくそのreadLine()でブロックしています(クライアントは同じ接続を介して応答を取得するために待機する必要があります)。通常、HTTPサーバーはリクエストを読み取るときに解析します。これに基づいて、「\ r \ n \ r \ n」を検索してヘッダーの終わりを区切り、その時点で読み取りループから抜け出します。リクエストを解析して応答します。

于 2010-10-20T18:53:36.793 に答える
0

まず、whileループの条件を次のように変更します
while(in.hasNextLine()) {
    message = in.nextLine();
    //etc....

次に、サーバーの実行中にwhileループを終了する必要はありません。リクエストを区別するためにifステートメントを使用して、whileループ内でリクエストのすべての解析を実行する必要があります。whileループを終了するのは、接続を閉じる必要があるときだけです。そうしないと、nextLine()何かが受信されるまでメソッドがブロックされます。

于 2011-02-05T05:56:20.930 に答える