0

サーバーとクライアントが相互に通信するアプリケーションを構築しています-telnet経由。(ソケット経由)。サーバープログラムは、いくつかのガスのタンクを監視しており、受け入れられたクライアントにソケットを介して温度レベルと事前保証レベルを送信します。

telnetで何かを書くときに、クライアントとサーバーが相互に通信 できるようになりましたが、送信するデータを処理するために助けが必要です。

ユーザーが有効なユーザーであるかどうかを判断するために、ログインスクリプトを作成しました。したがって、「myname」、「space」、「mypassword」のような2つの単語を書くことができ、緑色のライトが表示され、有効なユーザーが返されます。しかし、1つの単語だけを書き込んで、 Enterキーを押すと、次のようになります。スレッド内の例外... java.lang.Array.IndexOutOfBoundsExeption exitまたはlogoutを書き込むときのEXEPT!

(テストで使いやすいように、すべてのユーザーがスクリプトにハードコーディングされています(ログインスクリプトはそれ自体で正常に機能し、何か間違ったことを書くと有効なuser = falseを返します)。これが私のコードです。何をすべきか100%確信が持てない...;)

String telNetCommand = dataIn.readLine();
            System.out.println(telNetCommand);

            String dataInArray[] = telNetCommand.split(" ");

            user.isValid(dataInArray[0], dataInArray[1]);

            if (dataInArray[1] == "\n") {
            //Ignore login request and continue telnet-logging?
            }

クライアントアプリケーションには、次のような各コマンドのボタンがあります。

「n番目ごとにデータを送信する」または「n番目ごとにデータのバッチを送信する。コマンドがexitに等しい場合、またはログアウト->操作を中断する...。

// --------------// USER INPUT FROM CLIENT APP //--------------------------//

            // --------------// CONTINUE ? //----------------------------//
            if (command.equals("CONTINUE")) {
                continueSession();
                else  {    //..Kill session
                }   
            }

            // --------------// SKIP <N> //----------------------------//
            if (command.equals("SKIP_N")) {
                skipEveryNthData();
            }

            // --------------// BATCH <N> //---------------------------//
            if (command.equals("BATCH_N")) {
                batchEveryNthData();
            }

            // --------------// LOGG OUT #1 //-------------------------//
            if (command.equals("logout") || command.equals("exit")) {
                break;
            }

今少し混乱しているかもしれませんが、すべてのデータを配列に入れて確認する必要があると思います

if
dataInArray[0] == "CONTINUE"
dataInArray[0] == "SKIP_N", or
dataInArray[0] == "BATCH_N" 
(then send some data back)...

と...

if dataInArray[1] == "enter" ("\n") execute the single word commands ...??
if dataInArray[0] == "LOG_IN" or "PASSWORD" check if valid user is true..

ヘルプやヒントをありがとう!:)

4

3 に答える 3

1

IndexOutOfBoundsExeptionおそらく次の原因が考えられます。

user.isValid(dataInArray[0], dataInArray[1]);

配列に2が含まれるように、着信String telNetCommandに少なくとも1つのスペースが含まれていることを確認してください。Strings配列のサイズをチェックしてこれを行うことができます:

if (dataInArray.length < 2) {
   throw new IllegalArgumentException(telNetCommand + " only contains " + dataInArray.length + " elements");
}

String.equalsまた、別の注意点として、文字列の内容を確認するときに必ず使用してください。

if ("\n".equals(dataInArray[1])) {
于 2012-10-21T16:40:53.253 に答える
1

コードのこの部分では:

String dataInArray[] = telNetCommand.split(" ");
user.isValid(dataInArray[0], dataInArray[1]);

telNetCommand文字列にスペースが含まれていると想定します。そうでない場合は、dataInArray要素が1つだけ含まれ、。dataInArray[1]がスローされIndexOutOfBoundsExeptionます。

配列のサイズを確認する必要があります。

if (dataInArray.length < 2) {
    //no space in the command - do what you need to do
    //for example an error message
}
于 2012-10-21T16:41:24.317 に答える
1

みんなありがとう。今ではエラーは発生しません...そして、これが私がやったことです。エラーが発生しないように、== 2 に設定する必要がありました。

while (true) {
            String telnetCommand = dataIn.readLine();

            System.out.println(telnetCommand);

            String dataInArray[] = telnetCommand.split(" ");

            if (dataInArray.length == 2) {
                user.isValid(dataInArray[0], dataInArray[1]);
            }

            if (dataInArray.length < 2) {
                if (telnetCommand.equals("CONTINUE")) {
                    continueThisSession();
                    System.out.println("Running method continueThisSession");
                }

                if (telnetCommand.equals("SKIP_N")) {
                    skipEveryNthData();
                    System.out.println("Running method skipEveryNthData");
                }

                if (telnetCommand.equals("BATCH_N")) {
                    batchEveryNthData();
                    System.out.println("Running method batchEveryNthData");
                }

                if (telnetCommand.equals("logout")  || telnetCommand.equals("exit")) {
                    break;
                }
            }
        }

平和 :)

于 2012-10-21T19:14:51.103 に答える