2012-05-06 20 views
2

私はクライアントとサーバーで構成されるJavaアプリケーションを持っています。クライアントは暗号化されたコマンドをサーバーに送信し、サーバーはそれを実行します。Java:ソケットから複数行を取得する

私の現在の暗号化アルゴリズムでは、暗号化されたコマンドに「\ n」または「\ r」文字が含まれていることがあります。これは、私が行終端文字を見つけると停止するreadLine()メソッドを使用しているためです。私が必要とするのは、クライアントが1つの文字列に送るすべての文字を読み取る方法です。ここで

は私のコードです:私は(読み取り()関数を使用して、ネストされたループの様々な形を)試した

public void run(){    
     System.out.println("Accepted Client!"); 

     try{         
      in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "ISO8859_1")); 
      out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "ISO8859_1")); 

      String clientCommand = null; 

      while(RunThread){      
       // read incoming stream 
       do{ 
        clientCommand = in.readLine(); 
       }while(clientCommand == null); 

       //decrypt the data 
       System.out.println("Client: " + clientCommand); 

       if(clientCommand.equalsIgnoreCase("quit")){ 
        RunThread = false; 
       }else{ 
        //do something 
        out.flush(); 
       } 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

すべてが働いていません。私は何か助けや提案を歓迎する。みんな、ありがとう!

+0

単純にテキスト、Reader/Writer、Input/OutputStream、およびバイナリデータ(バイト)を読み込まないでください。上記のコードでは、エンコーディングが混乱を招く可能性があります。 –

答えて

1

投稿したコードに暗号化が表示されませんが、通常は区切り文字を使用することはお勧めできません。

バイナリデータを送信するときは、データの長さをストリームの前に置く必要があります。次に、予想されるバイト数とメッセージが終了する時刻を正確に知る必要があります。改行文字を探しています。

+0

ありがとう!だから、コードの面でどうやってやるの?私の本当の苦労は、待ち受けと受け取りの仕方です。私は無限ループに終わるか、何も受け取りません。データがいつ届くのかを私はどのようにして知ることができ、どのくらい読むことができますか? – Jason

+0

@Jason基本的には、ループはread()を呼び出してメッセージの長さを含むcharを取得します(メッセージが利用可能になるまでブロックします)。その後、その長さを使ってreadを呼び出して、メッセージをバイト配列に読み込みます。そこから解読したり、文字列に変換することができます。 – takteek

+0

あなたは素晴らしいです。それがトリックでした、そして今それは素晴らしい作品です。ありがとう! – Jason

0
// read incoming stream 
do{ 
    clientCommand = in.readLine(); 
}while(clientCommand == null); 

あなたがしなければならない== nullが間違っているようだ

てみ

String line = null; 
do { 
    line = in.readLine(); 
    clientCommand += line 
} while (line != null); 
+0

そのコードは、改行や改行文字を失うことを除いて、ある点までうまくいくかのようです。私は文字列を解読するためにすべての文字を必要とし、元々は "\ r \ n"または "\ r"だったかもしれないので、単純に "\ n"を追加することはできません。 。 。 – Jason

0

ことの一つは、TCP/IPで作業する場合、実際のメッセージの前にメッセージの長さを送信することです。アプリケーションレベルは、TCPレベルが運命に提供しているパッケージサイズを予測することはできません。あなたのメッセージの前に、あなたはメッセージサイズのヘッダーを送る必要があり、運命はこれらのバイトだけを読むでしょう。 についてreadLine()については、ストリームのような別のアプローチを使用する方が良いと思います。まもなく、1つの提案:

Socket oSocket = new Socket(sAddress, iPort); 
    PrintWriter out = new PrintWriter(oSocket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(oSocket.getInputStream())); 
+0

'素晴らしい提案です。しかし、まだ、私は失われています。文字列にデータを実際に受け取っている後ろの物流は何でしょうか? – Jason

0
do{ 
    clientCommand = in.readLine(); 
} while(clientCommand == null); 

これは意味がありません。 readLine()はストリームの最後にnullを返すだけなので、ストリームの最後に無限ループするようJavaに指示します。なぜループがあるのか​​、私は理解していません。クライアントからの入力を無視する必要はなく、すべて処理する必要があります。クライアントから1行を読み込んで実行し、別の行を読み込む必要があります。 nullまで繰り返し、ソケットを閉じます。

関連する問題