2011-11-12 8 views
0

VMware-Workstation(Version:8.0.0 build-471780)との通信用にJavaでソケットを実装しています。ソケットとVMware-Workstationスタブの通信に関する問題

私は仮想マシンをローカルで実行しているので、Socket socket = new Socket("localhost",8832);でソケットを作成し、8832はVMwareがdefalutによるデバッグをリッスンするポートです。 接続が拒否されていないか、何らかの例外がスローされていません。 しかし、私は自分のプロセスと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); 
} 

第2の方法は、決して終わりません。

Javaプロセスを終了すると、仮想マシンはデバッガの接続が失われたことに気づくため、接続が正常に完了したと言うことができます。

誰かが私を助けることができますか?もう何をすべきかわからない。

答えて

0

仮想マシンを使用せずに、同じシステムでプログラムを実行できますか?

戻り値はreadで無視しないでください。完全長が読み取れない可能性があります。送信したときと同じ数の「メッセージ」を受信すると、アプリケーションがハングアップする可能性があります。これは、Socketがバイトストリームであり、任意の数の送信文字列を結合または分割することができるためです。

より安全なアプローチは、DataOutputの/、入力ストリームが

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

残念ながら、私は仮想マシンの外でプログラムを実行することはできません使用することです。私はあなたの言った方法を試しましたが、 'getStr()'メソッドでハングします。おそらく、 'sendStr()'でも同様のことが起こっていますが、 'getStr()'だけがブロックされているので、そこにハングアップします。 – onurbruno

+0

仮想マシンの内部で実行できますか?送信者が送信していないためにgetStrがハングする場合。 writeUTF()の前と後にログメッセージを追加して送信しているかどうかを確認します。 –

+0

あなたはそうです、それはまた送信していません! vmware.logファイルに "Debug stub remote connection accepted"と表示されているので、接続に問題はありません。 – onurbruno