Проблема в соединении сокета и заглушки VMware-Workstation - PullRequest
0 голосов
/ 12 ноября 2011

Я реализую сокет в 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 Ответ

0 голосов
/ 12 ноября 2011

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

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

Более безопасный подход - использовать DataOutput / InputStreams

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