これに非常にこだわっているので、あなたが与えることができるどんな助けにも感謝します!
Android アプリとマルチソケットJava サーバーの 2 つのプログラムがあります。Android アプリは、最初にサーバーへのアウトバウンド接続 (ポート 21) を確立し、次にサーバーからのインバウンド接続 (ポート 1025) を受け入れます。一貫性を保つために、接続が確立される方向に関係なく、常に Android アプリをクライアント、Java アプリをホストと呼びます。
プログラムはローカル ネットワーク上で完全に動作し、Android フォンがローカル サーバー IP に接続されている192.168.1.103
か、サーバーをホストしている PC 上のエミュレーターが に接続されています10.0.2.2
。
ただし、ローカル イントラネットの外に移動すると、ポート 21 で Android->server 接続を確立できますが、サーバーからポート 1025で電話に接続しようとするとタイムアウトします。
私が説明しているもののリスト:
- Android エミュレーターでポート 1025 がリダイレクトされる
- Windows (Win 7 サーバー ホスト) ファイアウォールが無効になっている、他の既知のファイアウォールが無効になっている
- 着信接続リスナーはメイン スレッド上にありません (SDK 2.1 は重要ではありません)。
- ルーターのポート 21 と 1025 が転送されています
テストとその結果のリスト:
- ローカル ネットワーク上のエミュレーター/Android フォン/リモート ネットワーク上の Android フォンからサーバーのパブリック IP (ルーターが存在する) に接続する - サーバー - > 電話接続の確立に失敗する
- ルーターを取り外し、エミュレーターまたはリモート Android フォンから接続する -サーバー -> 電話接続の確立に失敗する
- エミュレータから への接続
10.0.2.2
、ルータの有無にかかわらず -成功 - ローカル ネットワーク上の Android フォンから
192.168.1.103
-に接続すると成功します
最後に、いくつかのコード、サーバーの出力接続試行(このクライアントのサブスレッドは、サーバーがインバウンド接続を受信したときに既に作成されているため、コンストラクターで接続が作成されます)
OutputSocketServer(InetAddress inetAddress, int port, int count , LinkedBlockingQueue<Packet> outQueue) {
this.outQueue = outQueue;
SocketAddress sockaddr = new InetSocketAddress(inetAddress,port);
try {
outConnection = new Socket();
System.out.println("Connecting to " + sockaddr.toString());
outConnection.connect(sockaddr, timeout);
System.out.println("Connected to port " + outConnection.getPort() + " of " +outConnection.getInetAddress().toString() + " from local port " + outConnection.getLocalPort());
osw = new ObjectOutputStream(outConnection.getOutputStream());
} catch (IOException e) {
System.out.println("Output Socket Server: Could not establish outbound connection" + e.toString());
e.printStackTrace();
}
}
および Android クライアントの接続受け入れコードの関連部分
public void run() {
try {
System.out.println("Listening for connection on local port " + inSocket.getLocalPort());
this.inConnection = inSocket.accept();
System.out.println("Accepted connection on port " + inConnection.getPort() + " from ip " + inConnection.getInetAddress().toString());
isr = new ObjectInputStream(inConnection.getInputStream());
}
catch (Exception e) {
System.out.println("Inbound Socket Server: " + e.toString());
}
}
Android クライアントのスタック トレースには、SocketTimeoutException: operation timed out
and for the server とだけ表示されますConnectException: connection refused: connect
。その前に、クライアントの LogCat ショーListening for connection on port 1025
とサーバーConnecting to /my.ip.he.re:1025
ご指導ありがとうございます。