Help!私はAndroid StudioでシンプルなJavaソケットネットワーキングをやろうとしています。サーバプログラムは、[OK]を動作しているようだが、ラインを実行中にエラーとAndroidアプリのクライアントがクラッシュし、「残念ながら、InTouchが停止しました」:私は入れホスト名はCによって報告されたものであるSocket(hostname、port)を実行するとアンドロイドがクラッシュする
sock = new Socket("Mark2015jun08", 4415);
場所:>hostname
コマンドを実行すると、Windowsの[ネットワークコントロールパネル]が表示され、ルータにログインするとDHCPテーブルに表示されます。それはドキュメントがループバックを開かなければならないと言っているホスト名を ""入れたときにクラッシュします。私はSocket()
を12個の異なる方法で呼び出してみました。下のコードから分かります。私は確かにいくつかの助けを使うことができた おかげで、私はonResume()
方法で、次のtry文を入れアンドロイドクライアントプログラムで-mark
:
try {
//sock = new Socket("Mark2015jun08", 4415);
byte[] ip = {(byte)192, (byte)168, (byte)1, (byte)124};
//sock = new Socket(InetAddress.getByAddress(ip), 4415);
//sock = new Socket(InetAddress.getByName("192.168.1.124"), 4415);
//sock = new Socket("LOCALHOST", 4415);
sock = new Socket("", 4415);
// ommitted logic to set socket timeout and
// open object streams based on sock
} catch (IOException e){
sock = null;
log(e.toString());
}
のWindowsのipconfigとルーターのDHCPテーブルの両方が私のIPアドレスを確認し、両方の私はまだ取得同じエラー。 3つの異なるソースがすべて私のホスト名に同意しますが、ホスト名のためにどんな文字列を入れても ""うまく動作しません。私は間違って何をしていますか?
私は私のManifest.xmlファイルに次の権限を使用します。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
これは私のサーバープログラムは、以下のNetBeansで作成され、私は、コマンドCとWindowsのcmd.exe
ウィンドウから実行します:>java -jar intouchserver.jar
。これは、ラップトップ上のサーバープログラムを実行し、それがライン
sock = serversock.accept();
に取得し、accept()
のマニュアルに説明して正確に停止します。私の知る限り(注:私はこの文の前serversock
チェック:。それがnullでない)、それはポート4415を聴いています言うことができるように
package intouchserver;
import ...
public class InTouchServer {
private static ServerSocket serversock;
private static Socket sock;
public static void main(String[] args) {
try {
serversock = new ServerSocket(4415);
sock = serversock.accept();
} catch (IOException e){
System.out.println("Can't establish socket");
System.out.println(e);
System.exit(1);
}
// ommitted logic to open object streams based on sock
// and read and write to them
}
}
logcat出力では、これをデバッグするのに必要なエラー情報を含むより詳細なスタックトレースが得られます。 –
'logcat'を使うと' catch'ブロックが実行された場合にのみ役立ちますが、ここではそうではありません。クライアントアプリケーションは、 'sock = new ...'ステートメントに遭遇したときに、操作によって実行されなくなります。エラーに関する私が得ることができる唯一の情報はAndroidメッセージです: "残念ながらアプリケーションは停止しました。"以上です。そこから行く唯一の場所はホームページに戻る – mark777
いいえ、私は同意しません。最初に、あなたがそれをやっているやり方で例外をキャッチしないでください。完全なスタックトレースが必要なので、完全なスタックトレースを記録するようにしてください。次に、アンドロイドに「残念ながら...停止しました」と表示されるキャッチされていない例外は、完全なスタックトレースをlogcatファシリティに送信します。 –