【问题标题】:Issue in communicating socket and VMware-Workstation stub通信套接字和 VMware-Workstation 存根中的问题
【发布时间】:2011-11-12 23:15:23
【问题描述】:

我正在用 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 进程时,我的虚拟机注意到调试器连接丢失,因此我可以说连接成功。

有人可以帮我吗?我不知道该怎么办了。

【问题讨论】:

    标签: java sockets stub vmware-workstation


    【解决方案1】:

    您可以尝试在同一系统中运行程序,而不使用虚拟机吗?

    忽略read 的返回值不会保存,因为它可能无法读取完整长度。如果您希望收到与您发送的相同数量的“消息”,您的应用程序可能会挂起。这是因为 Socket 是一个字节流,您可以将任意数量的发送字符串组合或拆分。

    更安全的方法是使用 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.
    }
    

    【讨论】:

    • 很遗憾,我无法在虚拟机之外运行程序。我试过你说的方式,但它挂在'getStr()'方法上。 'sendStr()' 可能正在发生类似的事情,但只有 'getStr()' 被阻塞,所以我就挂在那里。
    • 那你能在虚拟机里面运行吗?如果 getStr 挂起它是因为发件人没有发送。我会在 writeUTF() 之前和之后添加一条日志消息,以查看它是否正在发送。
    • 你是对的,它也不发送!问题似乎与连接无关,因为 vmware.log 文件显示:“已接受调试存根远程连接”
    • 没关系,问题不在于套接字或类似的东西。我只是不知道协议中的一些特殊性。无论如何,谢谢你的帮助。
    猜你喜欢
    • 2023-03-29
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多