#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. Неважно, проблема была не в сокетах или чем-то подобном. Я просто не знал о некоторых особенностях протокола. В любом случае, спасибо за вашу помощь.