3

練習としてJavaで単純なWebサーバーを構築しようとしていますが、非常に奇妙な問題が発生しています。InputStreamからを読み取ろうとすると、読み取るSocketデータがない場合があります。私がフォローしているプロセスは次のとおりです。

を作成しServerSocket、ポート80でリッスンし、を呼び出しaccept()てを取得しSocketます。次に、ブラウザ(Firefox)からにリクエストを送信します。localhostこれにより、がトリガーaccept()されてが返されSocketます。

場合によっては、HTTPリクエストを完全に読み取ることがあります。それ以外の場合は、データの読み取りに失敗します(read()-1を返します)。

例外処理をスローせずに、私が行っていることを説明するためのサンプルコードを次に示します。

ServerSocket serv = new ServerSocket(80);

while (true)
{
  Socket con = ServerSocket.accept();

  InputStream input = con.getInputStream();

  bytes[] bytes = new bytes[4000000]; // for simplicity, I figured I'd 
                                      // just make the array huge for now

  int bytesRead = input.read(bytes);
  if (bytesRead > 0)
  {
    StringBuffer sBuffer = new StringBuffer(bytesRead);

    for (int i = 0; i < bytesRead; i++)
    {
      sBuffer.append((char) bytes[i]);
    }

    System.out.println(sBuffer.toString());
  }
}

編集:私はまた、とを使用して利用しようとしましBufferedInputStreamBufferedReader

4

2 に答える 2

3

1つのソケットでより多くのパケットを受信できます。したがって、ソケットごとに新しいスレッドを作成する必要があります。何かのようなもの:

while(true){
    Socket socket = serv.accept();
    Client client = new Client(socket);
    new Thread(client).start();
}

次に、実行可能なインターフェイスを実装するClientクラスを作成する必要があります。

Socket socket;
public Client(Socket socket){
    this.socket = socket;
}
public void run(){
    while(socket.isConnected()){
        //here reads the packets from the inputstream
    }
}
于 2012-09-24T19:18:27.877 に答える
3

InputStreamからデータを読み取るときは、常にループする必要があります。すべてのデータが1回のread()呼び出しから返されるという保証はありません(受信するまでループします-1)。

于 2012-09-24T19:21:40.013 に答える