Обработка одного или нескольких слов в Java Socket .readLine()

Я создаю приложение, где у меня есть сервер и клиент, которые общаются друг с другом -через телнет, (через сокет). Серверная программа контролирует резервуар некоторого газа и отправляет принятым клиентам уровень температуры и уровень давления через сокет.

Мне удалось заставить клиента и сервер общаться друг с другом, когда я пишу материал - в telnet--, но...Мне нужна помощь для обработки отправляемых данных.

Я сделал loginscript, чтобы определить, является ли пользователь действительным пользователем или нет. Поэтому я могу написать два слова, такие как "мое имя", "пробел", "мой пароль", и я получаю зеленый свет и возвращает действительного пользователя. Но когда я пишу только одно слово и нажимаю ввод, это дает мне:Исключение в потоке... java.lang.Array.IndexOutOfBoundsExeption 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-ые секунды. Если команда равна выходу, или выход из системы - > операция прерывания..."

// --------------// 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..

Спасибо за любую помощь и / или советы!:)

3 ответа

Решение

Спасибо, парни. Я не получаю никаких ошибок сейчас... И вот что я в итоге сделал. Я должен был установить это == 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;
                }
            }
        }

Мир:)

IndexOutOfBoundsExeption более чем вероятно вызвано:

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

Убедитесь, что входящий StringtelNetCommand содержит по крайней мере один пробел, так что у вас есть в 2 Strings в массиве. Вы можете сделать это, проверяя размер массива:

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

Кроме того, на другой ноте, обязательно используйте String.equals при проверке содержимого строки:

if ("\n".equals(dataInArray[1])) {

В этой части вашего кода:

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

Вы предполагаете, что telNetCommand Строка содержит пробел. Если это не так, dataInArray будет содержать только один элемент и dataInArray[1] бросит IndexOutOfBoundsExeption,

Вы должны проверить размер массива:

if (dataInArray.length < 2) {
    //no space in the command - do what you need to do
    //for example an error message
}
Другие вопросы по тегам