2011-08-11 14 views
5

これで、サーバーが新しいクライアントを作成する接続を受け入れるたびに、「クライアント」と呼ばれるスレッドクラスがあります。実行メソッドはクライアントからのメッセージをリッスンしますObjectInputStreamのに..Java - ObjectInputStreamでソケットを聴く

do {    
     ObjectInputStream in = null; 

     try { 
      in = new ObjectInputStream(socket.getInputStream()); 
      String message = (String) in.readObject(); 
      System.out.println(message); 
      } 
      catch (ClassNotFoundException ex) { 
       isConnected = false; 
       System.out.println("Progoramming Error"); 
      } 
      catch (IOException ex) { 
       isConnected = false; 
       System.out.println("Server ShutDown"); 
       System.exit(0); 
      } 
    } while(isConnected); 

をuseingています私が持っている問題は、なぜ私は新しいのObjectInputStreamにそれがループするたびに作成する必要があります...と私はループの最後で、入力ストリームを閉じて、それがループする場合はないということですもう一度別のメッセージが表示されたらエラーが表示されます...

+2

あなたはそうする必要はありません。するべきではありません。 –

+1

ClassNotFoundExceptionを取得することは、もはや接続エラーでもプログラミングエラーでもないことを示すものではありません。 *デプロイメントエラーを示します。 – EJP

+0

あなたはどのようなエラーが発生しているのかを知ることができますし、クライアントコードも投稿した場合に役立ちます。 – beny23

答えて

6

クライアント接続のためにObjectInputStreamをループ外に作成してから、 readObjectメソッドをループに追加します。 ObjectStreamの谷に送信されます。この例の文字列で

public class TestPrg { 

    public static void main(String... args) throws IOException { 
     ServerListener server = new ServerListener(); 
     server.start(); 

     Socket socketToServer = new Socket("localhost", 15000); 
     ObjectOutputStream outStream = new ObjectOutputStream(socketToServer.getOutputStream()); 

     for (int i=1; i<10; i++) { 
      try { 
       Thread.sleep((long) (Math.random()*3000)); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Sending object to server ..."); 
      outStream.writeObject("test message #"+i); 
     } 
     System.exit(0); 

    } 

    static class ServerListener extends Thread { 

     private ServerSocket serverSocket; 

     ServerListener() throws IOException { 
      serverSocket = ServerSocketFactory.getDefault().createServerSocket(15000); 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        final Socket socketToClient = serverSocket.accept(); 
        ClientHandler clientHandler = new ClientHandler(socketToClient); 
        clientHandler.start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    static class ClientHandler extends Thread{ 
     private Socket socket; 
     ObjectInputStream inputStream; 

     ClientHandler(Socket socket) throws IOException { 
      this.socket = socket; 
      inputStream = new ObjectInputStream(socket.getInputStream()); 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Object o = inputStream.readObject(); 
        System.out.println("Read object: "+o); 
       } catch (IOException e) { 
        e.printStackTrace(); 

       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

} 

はここで働いてテストクラスです。 ClassNotFoundException(http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject())を取得し、独立したクライアントおよびサーバープログラムを使用している場合は、クライアントとサーバーの両方に、クラスパスで送信するオブジェクトのクラスがあります。

+0

ohhh私は見る...その友達に感謝..私はそれを後で試してみると、それがどうなるか教えて... – MurWade

+0

私はそれを試して、それは仕事をしなかった.... – MurWade

+1

睡眠は無意味であり、読み込みループは 'EOFException'を捕らえ、キャッチされた時に読み込みループから抜け出すべきです。 'SocketTimeoutException'を除く他の全ての' IOExceptions'も接続にとって致命的であり、読み取りループを終了しなければなりません。何らかの理由で読み取りループが終了したら、ソケットを閉じる必要があります。ここではあまりにも悪い練習。 – EJP

関連する問題