Обработка одного или нескольких слов в 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]);
Убедитесь, что входящий String
telNetCommand
содержит по крайней мере один пробел, так что у вас есть в 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
}