2017-07-26 14 views
0

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   
    } 
} 
+0

logcat出力では、これをデバッグするのに必要なエラー情報を含むより詳細なスタックトレースが得られます。 –

+0

'logcat'を使うと' catch'ブロックが実行された場合にのみ役立ちますが、ここではそうではありません。クライアントアプリケーションは、 'sock = new ...'ステートメントに遭遇したときに、操作によって実行されなくなります。エラーに関する私が得ることができる唯一の情報はAndroidメッセージです: "残念ながらアプリケーションは停止しました。"以上です。そこから行く唯一の場所はホームページに戻る – mark777

+1

いいえ、私は同意しません。最初に、あなたがそれをやっているやり方で例外をキャッチしないでください。完全なスタックトレースが必要なので、完全なスタックトレースを記録するようにしてください。次に、アンドロイドに「残念ながら...停止しました」と表示されるキャッチされていない例外は、完全なスタックトレースをlogcatファシリティに送信します。 –

答えて

0

私は自分自身の問題を解決しました。 Socket()コールがonResume()関数内にある場合、私はそれを置くとかなり役に立たないエラーメッセージが表示されますが、関数にSocket()コマンドを置くと、より有益なエラーが発生します。つまり、 "NETWORK ON THE MAIN糸"。だから、Socket()コールをスレッドに入れて問題を解決し、私は行った。ジェームズ・K・ポークさんをlogcatに関するヒントをいただき、ありがとうございます。私はそれらの "Application has Stopped"というメッセージに苦労してきました。

関連する問題