2012-04-04 16 views
0

javaプログラムを使用してサーバーにデータを読み書きしようとしています。私はコンソールを使ってデータを書いています。私は正常にデータをサーバーに書き込むことができますが、サーバーが送信したデータを読み取ろうとすると問題が発生します。Javaのサーバーからデータを読み取ることができません

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


public class EMSSocketConnection { 



    public static void main(String[] args) throws Exception { 

     createSocket(); 
    } 

    private static void sendMessage(DataOutputStream out) throws Exception 
    { 
     try 
     { 

      BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
      String userOutput; 
      while ((userOutput = stdIn.readLine()) != null) 
      { 
       out.writeBytes(userOutput); 
       out.write('\n'); 
      } 
      out.flush(); 

     } 
     catch(Exception ex) 
     { 
      System.out.println(ex.getStackTrace()); 

     } 
     finally 
     { 
      out.close(); 
     } 
    } 


    private static void readResponse(DataInputStream in) throws Exception 
    { 
     try 
     { 
      byte[] data = new byte[1024]; 
      in.readFully(data); 
      System.out.println(data); 


     } 
     catch (Exception ex) 
     { 
      System.out.println(ex.getMessage()); 

     } 
     finally 
     { 
      in.close(); 
     } 
    } 

    private static void createSocket() 
    { 

     try 
     { 
      int port = 2345; 
      InetAddress address = InetAddress.getByName("192.100.100.129"); 
      final Socket client = new Socket(address, port); 
      final DataOutputStream out = new DataOutputStream(client.getOutputStream()); 
      final DataInputStream in = new DataInputStream(client.getInputStream()); 

      System.out.println("Successfully Connected"); 



      new Thread() { 
       public void run() { 
        synchronized(client) 
        { 
         try { 
          while(true) 
          { 
          sendMessage(out); 
          readResponse(in); 
          } 
         } 
         catch (Exception ex) 
         { 
          System.out.println(ex.getMessage()); 
         } 
        } 
       } 
      }.start(); 
     } 
     catch(Exception ex) 
     { 
      ex.getStackTrace(); 
     } 
    } 

} 

どのようにしてサーバーからデータを正常に読み取ることができますか?

+0

問題が何ですか。特定のエラーメッセージやスタックトレースがありますか? – beny23

+0

エラーメッセージはありません。サーバーからコンソールに送信データを印刷できません。 – Stardust

+0

サーバーが1024バイトを送信していますか?どのようなデータですか?文字列、数字? – beny23

答えて

2

サーバーの出力に1024バイトを書き込んでいますか?そうでない場合は、コード

byte[] data = new byte[1024]; 
in.readFully(data); 

はブロックされ、無期限に待機します。

はるかに良いイディオムはこれを行うには、次のようになります。

byte [] data = new byte[in.available()]; 
in.readFully(data); 

あなただけのストリームから行き当たりばったり読んで、あなたが予想されるデータを取得しますと仮定することはできません。ストリームはIO遅延とバッファリングに悩まされており、特にネットワークIOを扱う場合は、これに注意する必要があります。

+0

1024バイトを書き込んでいません。以前私はコードSystem.out.println(in.readUTF())を使ってデータを読み込もうとしましたが、失敗しました。 – Stardust

+0

ご協力ありがとうございますが、私はまだサーバーからデータを読み取ることができません。私は "readRespone"メソッドを実行しようとすると、私は "ストリームを閉じた"例外を取得しています。理由を教えてください。 – Stardust

+0

クライアントがデータを読み取る前に、サーバが出力ストリームを明らかに閉じています。あなたのサーバーは、クライアントが読むために十分長く生きている必要があります。これを行う最も重大な方法は、サーバーが応答を出力した後にThread.sleep()呼び出しを追加することです。 – mcfinnigan

関連する問題