Проблема в соединяющемся сокете и заглушке VMware-Workstation

#java #sockets #stub #vmware-workstation

#java #сокеты #заглушка #vmware-workstation

Вопрос:

Я реализую сокет на Java для связи с VMware-Workstation (версия: 8.0.0 build-471780).

Я создаю сокет с помощью: Socket socket = new Socket("localhost",8832); , поскольку я запускаю виртуальную машину локально, а 8832 — это порт, который VMware прослушивает для отладки по умолчанию. Соединение не отклоняется и не выдает каких-либо исключений. Однако у меня возникли проблемы с установлением связи между моим процессом и заглушкой VMware.

Эти методы неэффективно отправляют или получают что-либо из заглушки:

 public void sendStr(String str) throws IOException {
        out.write(str.getBytes());
}
public String getStr() throws IOException, ClassNotFoundException {//blocking call
    byte[] byteArray = new byte[40];
    in.read(byteArray);
    return new String(byteArray);
}
  

Второй метод никогда не заканчивается, поскольку это блокирующий вызов.

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

Кто-нибудь может мне здесь помочь? Я больше не знаю, что делать.

Ответ №1:

Можете ли вы попробовать запустить программу в той же системе, без использования виртуальной машины?

Не сохраняйте, чтобы игнорировать возвращаемое значение read , поскольку оно может не считываться по всей длине. Ваше приложение может зависнуть, если вы ожидаете получить то же количество «сообщений», что и отправляете. Это связано с тем, что сокет представляет собой поток байтов, и вы можете объединить или разделить любое количество отправленных строк.

Более безопасный подход заключается в использовании потоков вывода / ввода данных

 final DataOutputStream out = 

public void sendStr(String str) throws IOException {
    out.writeUTF(str);
}

final DataInputStream in = 

public String getStr() throws IOException {//blocking call
    return in.readUTF(); // will return exactly on string.
}
  

Комментарии:

1. К сожалению, я не могу запустить программу вне виртуальной машины. Я пробовал, как вы сказали, но он зависает при методе ‘getStr()’. Вероятно, что-то подобное происходит в ‘sendStr ()’, но блокируется только ‘getStr ()’, поэтому я зависаю именно там.

2. Тогда вы можете работать внутри виртуальной машины? Если getStr зависает, это потому, что отправитель не отправляет. Я бы добавил сообщение журнала до и после writeUTF(), чтобы проверить, отправляется ли оно.

3. Вы правы, он также не отправляет! Похоже, проблема не в соединении, поскольку vmware. в файле журнала указано: «Принято удаленное подключение к заглушке отладки»

4. Неважно, проблема была не в сокетах или чем-то подобном. Я просто не знал о некоторых особенностях протокола. В любом случае, спасибо за вашу помощь.