3

クライアントとサーバーで構成される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();
        }
  }

私が試したすべて(read()関数を使用したさまざまな形式のネストされたループ)は機能しませんでした。ヘルプや提案を歓迎します。みんな、ありがとう!

4

4 に答える 4

1

あなたが投稿したコードには暗号化が見られませんが、通常、区切り文字に依存することはお勧めできません。

バイナリデータを送信するときは、データの長さをストリームに追加する必要があります。そうすれば、予想されるバイト数(およびメッセージがいつ終了するか)を正確に知ることができます。改行文字。

于 2012-05-06T20:53:30.493 に答える
0
// read incoming stream
do{
    clientCommand = in.readLine();
}while(clientCommand == null);

その==nullは間違っているようです

試す

String line = null;
do {
    line = in.readLine ();
    clientCommand += line
} while (line != null);
于 2012-05-06T20:56:04.073 に答える
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()));
于 2012-05-06T20:58:21.207 に答える
0
do{
  clientCommand = in.readLine();
} while(clientCommand == null);

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

于 2012-05-07T00:10:43.577 に答える