2012-04-13 21 views
0

回答する前に、これはクライアントの問題であり、サーバーの問題ではないことに注意してください。私はターミナルでtelnetを使用していたので、サーバに接続し、telnetはサーバに接続できました。今、私はなぜconnectメソッドがローカルホストアドレスとサーバーのプライベートIPアドレスの両方を使用して接続できないのかわかりません。ブロックするだけで、コールバックメソッドを呼び出すことはありません。Javaソケットメソッドブロック '接続'が呼び出されたとき

   client.connect(new InetSocketAddress(hostname, 1993)); 
       callback.onConnection(); // Never invokes! 
       OutputStream writer = client.getOutputStream(); 
       InputStream reader = client.getInputStream(); 
       byte[] buffer = new byte[1024 * 1024]; 

P.S私は何か間違っています。私はUbuntuマシンでこのコードを実行しているので、telnetがサーバーに接続できたのでファイアウォールの問題は発生しません。サーバーとクライアントの両方がTCPプロトコルを使用しており、クライアント側とサーバー側のどちらにも例外はスローされません。間違っていると思われるものに対する示唆は非常に役に立ちます。私はseverコードのようなより多くのコードを表示することができます。サーバーはC++で書かれており、クライアントはJavaで書かれています。

編集:

私は結局接続を確立できました。 connectメソッドを使用する代わりに、ソケットのコンストラクタを使用して相互に接続します。私はなぜ接続doesntの仕事を知らないのですか?接続が確立されるまで、

  client = new Socket(hostname, port); 
      callback.onConnection(); 
      OutputStream writer = client.getOutputStream(); 
      InputStream reader = client.getInputStream(); 
      byte[] buffer = new byte[1024 * 1024]; 
      reader.read(buffer); 
+0

提案:Wiresharkののコピーを取得し、3ウェイハンドシェイクで何が起こっているかを追跡:http://www.wireshark.org – paulsm4

+0

'callback'は何ですか? – biziclop

答えて

0

私は結局接続を確立することができました。 connectメソッドを使用する代わりに、ソケットのコンストラクタを使用して相互に接続します。私はなぜ接続doesntの仕事を知らないのですか?ここで

は、コード変更である:

 client = new Socket(hostname, port); 
     callback.onConnection(); 
     OutputStream writer = client.getOutputStream(); 
     InputStream reader = client.getInputStream(); 
     byte[] buffer = new byte[1024 * 1024]; 
     reader.read(buffer); 
1

私はあなたがそう、connectメソッドが実行をブロックしますブロックするソケットを使用しているとします。ここ

は、コード変更です。 http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/channels/SocketChannel.htmlを使用して非ブロックソケットを作成することができます。

+0

新しいSocket(hostname、port)のような接続を行うためにコンストラクタを使って解決しました。 –

1

接続を呼び出す前にisUnresolved()をアドレスでチェックしてみましたか?

関連する問題