2017-11-30 10 views
-1

ファイルをホストするための基本的なHTTPサーバーを作成していました。途中で私はサーバーがクライアントデータを受信して​​いることをテストしたかったのです。以下のコードを使用すると、NoSuchElementException例外がスローされます。 Scannerは、ほとんどの場合でもクライアントからの回線を受信して​​いません。ここでは、コードがあります:これが発生した場合、接続が低下したり、サーバーが最終的にクライアントデータを受信する前にJava ServerSocketがクライアントデータをランダムに受信しない場合があります

import java.net.*; 
import java.io.*; 
import java.util.*; 
import java.nio.file.*; 

public class Simple { 


    @SuppressWarnings("empty-statement") 
    public static void main(String[] args) { 
     try{ 
      ServerSocket ss = new ServerSocket(80); 
      while(true){ 
       try{ 
        Socket sock = ss.accept(); 
        InputStream in = sock.getInputStream(); 
        OutputStream out = sock.getOutputStream(); 
        out.write("HTTP/1.1 200 OK\r\nContent-type:text/html;charset=utf-8\r\n\r\n".getBytes()); 
        Scanner sc = new Scanner(in); 
        out.write(sc.nextLine().getBytes()); 
        sock.close(); 
       } catch(Exception ex){ 
        System.err.println(ex); 
       } 
      } 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 

} 

、クライアント接続は非常に長い時間を待ちます。どんな助けもありがとうございます。

いいえ、これはThis questionの複製ではありません。 (これらは2つの別々の質問です)。

+0

クライアントのハングアップを止めるには、キャッチブロック内のソケットを閉じるか、 'try(ソケットソケット= ss.accept()){...} catch ... 'を使用する必要があります。 –

+0

[mcve ]をクリックします。実際にこれをトラブルシューティングするには、接続のクライアント側に何があるかを知る必要があります。それはあなたが書いたコードか、ブラウザか他の何かですか? –

+1

クライアントがリクエストを送信する前にレスポンスを送信して、クライアントを混乱させるのではないかと思います。これは断続的な挙動を説明するかもしれない。 –

答えて

0

Scanner.nextLine()の前にScanner.hasNextLine()に電話する必要があります。そうしないと、この例外が確実に発生します。ソケットとは何の関係もありません。定義された動作はScanner. NB Java ServerSocket *never* receives data. An accepted Socket`はサーバ側で行います。

関連する問題