0

サーバーと接続したいとき、新しいソケットを作成する行でAndroidアプリケーションがクラッシュします。

ClientAppl.javaで接続するコードは次のようになります。

public class ClientAppl {
private InetAddress host;
private int port;
private Socket link = null;
ObjectInputStream istream;
ObjectOutputStream ostream;
private static MainActivity mainActivity;
private static ClientAppl instance = new ClientAppl(mainActivity);


private ClientAppl(MainActivity frm){
ClientAppl.mainActivity = frm;
}

public static ClientAppl getInstance(){
return instance;
}

public void makeConnection(String sIP, int port) throws IOException, java.net.ConnectException{
    if(link == null){

    System.out.println("Make connection...");
    this.host = InetAddress.getByName(sIP);
        this.port = port;
        link = new Socket(host, port);

        System.out.println("Inputkanaal & outputkanaal vastleggen...");
        ostream = new ObjectOutputStream(link.getOutputStream());
        System.out.println("OK - output");
        istream = new ObjectInputStream(link.getInputStream());
        System.out.println("OK - input");

        AcceptMessageHandler amh = new AcceptMessageHandler();
        Thread t = new Thread(amh);
        t.start();
    }
}

MainActivity.javaで、接続を開始するためにこのコードを追加しました。

txtServerIP = (EditText)findViewById(R.id.txtServerIP);
txtServerPoort = (EditText)findViewById(R.id.txtServerPoort);
try {
ClientAppl.getInstance().makeConnection(txtServerIP.getText().toString(),    Integer.parseInt(txtServerPoort.getText().toString()));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (ConnectException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

そして、これは私のマニフェストファイルです。どうしたの?:(

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="be.howest"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
    <activity
        android:name="project.client.pc.view.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

4

2 に答える 2

1
5-14 15:55:28.669: E/AndroidRuntime(572): android.os.NetworkOnMainThreadException

メイン(UI)スレッドでネットワーク操作を行うことに対して常に警告が出されており、この致命的な例外の原因となるプロアクティブなチェックによって、ネットワーク操作を行うことが事実上禁止されています。

于 2012-05-17T16:43:59.390 に答える
1

Chris が指摘しているように、UI スレッド以外のスレッドですべての TCP ソケット対話を行う必要があります。私のコードでは、AsyncTask でソケットを確立しています。これは恐ろしく聞こえますが、私ができるのであれば、確実にできます。ここにまともなチュートリアルがあります:

http://www.vogella.com/articles/AndroidPerformance/article.html

続いて、ソケットの「会話」ごとに新しいスレッドを生成します。これもそれほど難しくありません。

于 2012-05-17T17:04:36.867 に答える