0

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

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

PS私は何か間違ったことをしていますか?telnet がサーバーに接続できたため、ファイアウォールの問題ではありません。Ubuntu マシンでこのコードを実行しているため、ファイアウォールがないと思います。サーバーとクライアントの両方が TCP プロトコルを使用しており、クライアント側でもサーバー側でも例外はスローされていません。何が間違っている可能性があるかについての提案は非常に役立ちます。サーバーコードのようなコードをさらに表示できます。サーバーは C++ で作成され、クライアントは Java で作成されます。

編集:

やっと接続を確立することができました。connect メソッドを使用する代わりに、ソケットのコンストラクターを使用して内部的に connect を呼び出しました。接続が機能しない理由がわかりません。

コードの変更は次のとおりです。

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

3 に答える 3

1

ブロッキングソケットを使用していると思われるため、connect接続が確立されるまでメソッドは実行をブロックします。たとえば、 http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/channels/SocketChannel.htmlを使用して非ブロッキングソケットを作成してみてください。

于 2012-04-13T22:04:02.187 に答える
1

Have you tried checking isUnresolved() on the address before calling connect?

于 2012-04-13T22:06:17.923 に答える
0

やっと接続を確立することができました。connect メソッドを使用する代わりに、ソケットのコンストラクターを使用して内部的に connect を呼び出しました。接続が機能しない理由がわかりません。

コードの変更は次のとおりです。

        client = new Socket(hostname, port);
        callback.onConnection();
        OutputStream writer = client.getOutputStream();
        InputStream reader = client.getInputStream();
        byte[] buffer = new byte[1024 * 1024];
        reader.read(buffer);
于 2012-04-13T22:19:54.813 に答える