2

ポートが開いているかどうか、またはサーバーが実行されているかどうかを確認したいと思います。
「/system/bin/ping」や「InetAdress」など、すでに複数の方法で試しましたが、正しい場合は、これらで指定したポートにpingを実行できません:/

今回は DatagramSockets のようなアイデアで作成しました:

try { String messageStr="Hello!";
   int server_port = 25565;
   DatagramSocket s = new DatagramSocket();
   InetAddress local = InetAddress.getByName("11.11.11.11");
   int msg_length=messageStr.length();
   byte[] message = messageStr.getBytes();
   DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port); 
   textView1.setText("Inet");
   s.send(p); 
   textView1.setText("Send");
} catch (Exception e) {}

「Inet」は表示されますが、「Send」メッセージは表示されないため、送信で行き詰まります。例外メッセージを取得しようとしましたが、それは NetworkOnMainThreadException..

4

4 に答える 4

2

特定のポートに ping を実行することはできません。「ping」は ICMP エコー要求です。ICMP はインターネット層プロトコルであるため、「ポート」の概念はありません。

を使用しSocketて、ポートへの TCP 接続の確立を試みることができます。接続する場合、何かが TCP 接続をリッスンしていました。接続できない場合は、何らかの方法で到達できませんでした。

を使用しDatagramSocketて、パケットをポートに送信しようとすることができます。成功した場合、何かがデータを受信して​​いる可能性があります。失敗した場合は、間違いなく何かが間違っています (ちなみに、UDP 用に開いていないポートに宛てられた UDP パケットを受信した場合、または途中で積極的にパケットを拒否した場合は、ICMP エラー メッセージが返されます)。

TCP と UDP の両方をチェックするには、上記の両方を使用する必要があります。

InetAddressはデフォルトで ICMP リクエストを ping として使用しますが、それを行う権限がない場合は、代わりに TCP 接続を確立しようとすることに注意してください。ただし、ICMP パケットを生成する権限がある場合、代わりに強制的に TCP 接続を試行する方法はありませんしたがって、その方法を使用したい場合は、Socket.

于 2013-08-17T01:56:34.807 に答える
0

開いているポートや実行中のサーバーを探す代わりに、サーバーにサービスをブロードキャストさせ、クライアントからの応答をリッスンします。このリンクを確認してください: http://home.heeere.com/tech-androidjmdns.html これがお役に立てば幸いです。

于 2013-08-17T02:05:58.300 に答える
0

コマンドの出力を解析しnetstatて、目的のポートでリッスンしているものがあるかどうかを確認してみてください。

ProcessBuildernetstatコマンド、およびいくつかのparsingロジックを使用します。

于 2013-08-17T01:56:42.620 に答える