0

「クライアントのIPアドレスとサーバーへの接続回数を表示するブラウザにHTTP応答を返すTCPサーバーであるJavaプログラムを作成する」ことを試みています

現在、私が考えていることが起こっています。サーバーを作成し、リクエストのポート (引数としての入力) をリッスンしてから、バイト配列を埋めて、その配列を文字列に変換しています。この時点でリクエストを確認したいと思います。

私の問題は、Webブラウザにアクセスして「localhost:1235」と入力してこのサーバーに接続しようとすると、ブラウザが「接続中...」と言い続け、プログラムが何もせず、ただ座って待つことです。

この残りの部分を修正/実装するにはどうすればよいですか? 私の現在の問題は何ですか?

これまでのところ、ここに私のコードがあります

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class TCPHTTP 
{
private static final int MAXFILELEN = 4096000;
static byte[] request = new byte[MAXFILELEN];
static String[] log;

public static void main (String args[])
{
    if (args.length != 1) 
        throw new IllegalArgumentException( "Parameter(s): <Port>");

    int port = Integer.parseInt(args[0]); 

    ServerSocket socket = null;
    Socket sock = null;

    try 
    {
        socket = new ServerSocket(port);
    } 
    catch (IOException e) 
    {
        return;
    }
    for (;;) 
    {
        try 
        {
            sock = socket.accept();
            InputStream is = sock.getInputStream();
            int offset = 0;
            int len = 0;
            while ((len = is.read(request, offset, MAXFILELEN - offset)) >= 0)
            {
                offset += len;
            }

            String s = new String(request);
            System.out.println(s);

            // Add the users IP to the log
            String from = "From: ";
            int loglen = log.length;
            int indexOfSenderIP = s.indexOf(from, 0);
            indexOfSenderIP += from.length();
            int indexOfNewline = s.indexOf("\n", indexOfSenderIP);
            String sendersIP = s.substring(indexOfSenderIP, indexOfNewline);
            log[loglen] = sendersIP;

            //Find out how many times the sender IP appears in the log
            int timesVisited = 0;
            for(int i = 0; i < log.length; i++)
                if(log[i].endsWith(sendersIP))
                    timesVisited++;

            // Construct the HTTP response message
            String httpResponse = "";

            OutputStream os = sock.getOutputStream();
            os.write(httpResponse.getBytes());

            os.close();
            is.close();
            sock.close();
        } 
        catch (IOException e) 
        { 
            break; 
        }
}
}
}
4

4 に答える 4

0

ヘッダーを追加しContent-Lengthて応答のサイズを指定し、ブラウザーが読み取る量を認識できるようにすることを検討してください。

于 2012-05-16T19:29:01.357 に答える
0
String httpResponse = "";

これは有効な HTTP 応答ではありません。ブラウザは適切な応答を待っています。1つ送信します。

于 2012-05-17T03:12:34.883 に答える
0

プログラムがフリーズする理由は、クライアントが接続を閉じるのを待つためです (read は eof の後に <0 の値を返します)。クライアントから二重の [cr][lf] を受け取るまで読む必要があります。これは、http ヘッダーの終了を示すものです。

于 2012-05-16T19:36:33.347 に答える
-1

私が見たところ、クライアントのリクエストに答える前にソケットを閉じました

また、私はあなたのコードをテストしましたが、サイクルは決して終わらない

于 2012-05-16T19:24:20.387 に答える