Socket не получает вход в Java 7

Я столкнулся с интересной проблемой, пытаясь обновить одно из моих приложений с Java 6 до Java 7. Это простая программа сокетов Java. Он отправляет команду в сокет COM и получает ответ. Он отлично работает в среде Java 6, но когда я пытаюсь запустить тот же код в среде Java 7, сокет, похоже, ничего не получает в InputStream.

Я могу подтвердить, что сокет COM, к которому он подключается, получает команду и отправляет ответ. Это выполняется на той же машине в обоих случаях, когда брандмауэр отключен, и это тот же самый код работает одновременно.

Что-то изменилось в Java 7, у меня есть какой-то более глубокий недостаток, или это просто ошибка Java?

Ниже приведена небольшая версия кода.

public static void main(String[] arguments) throws Exception {
  InetAddress server = InetAddress.getByName(serverAddress);
  Socket sock = SSLSocketFactory.getDefault().createSocket(server.getHostAddress(), port);
  InputStream in = sock.getInputStream();
  OutputStream out = sock.getOutputStream();
  out.write(command.getBytes()); //Is valid command
  String token = "";
  responseReader: while (true) {
    try {
      Thread.sleep(1);
    }
    catch (InterruptedException exception) {}
    byte[] d = new byte[in.available()];
    int avail = in.read(d);
    for (int i = 0; i < avail; i++) {
      if (d[i] == fieldSeperator) {
        token = "";
      }
      else if (d[i] == commandSeperator) {
        break responseReader;
      }
      else {
        token += (char) d[i];
      }
    }
  }
}

Я пробовал столько, сколько могу придумать, большую часть времени зная, что это не имеет значения. Используя разные методы чтения потока, отбрасывая SSLSocket и делая разные вызовы, добавляя несколько сон.

0
nl ja de
Как вы обнаружили, что сокет не получает ничего в InputStream ? Отлаживать? Или распечатка?
добавлено автор Andremoniy, источник
Может быть, вы забыли flush ваш выходной поток после написания команды?
добавлено автор Andremoniy, источник
Как ведет себя сервер? Закрывает ли он сразу после записи вывода?
добавлено автор partlov, источник
Оба остаются открытыми до тех пор, пока не будет отправлена ​​команда разъединения.
добавлено автор Swop, источник
Я распечатал avail и напечатал, что токен был в любой момент времени в бесконечном цикле.
добавлено автор Swop, источник
COM-разъем успешно получает команду из сокета Java и записывает ответ обратно в сокет.
добавлено автор Swop, источник

1 ответы

Код неправильный. Вы не должны использовать доступные (). Если данных нет, вы будете распределять буфер нулевой длины и выполнять чтение нулевой длины, которое будет перенастраивать нуль без блокировки. Используйте константу, как 8192 для размера буфера, и выделите буфер вне цикла. И избавиться от сна() тоже.

Существует мало правильных вариантов использования доступных (), и это не один из них.

И обратите внимание, что available() всегда возвращает ноль для SSLSocket и всегда делал это прямо на Java 1.3 и отдельную загрузку JSSE. Поэтому я не могу согласиться с тем, что тот же код работал на Java 6.

1
добавлено
@Swop No. Он возвращает SSLSocket. В противном случае, каково было бы это в точности? Если вы не хотите использовать SSL, не используйте классы SSL.
добавлено автор EJP, источник
Да, это может быть сделано из JDK 6, если была получена и расшифрована полная запись SSL, которая является данными приложения. В противном случае он ничего не может сделать, кроме нуля.
добавлено автор EJP, источник
Socket sock = SSLSocketFactory.getDefault (). createSocket возвращает только стандартный сокет. Я только попробовал перебросить его в SSLSocket на Java 7, поскольку я пытался случайным образом.
добавлено автор Swop, источник
Большое спасибо, что решила проблему. Однако я дважды проверял, что он получил на Java 6 с помощью in.available() с SSLSocket, и он вернет действительное ненулевое число.
добавлено автор Swop, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async