-3

重複の可能性:
ソケットとAsyncTaskを使用して強制的に閉じる

スタックの皆さん、こんにちは。

私を助けてください、私は私の心を失っています。

コードとlogcatを参照してください.....

基本的に、コードが実行していることは次のとおりです。

  1. インテントからIPアドレスを取得します。
  2. ポート32でIPに接続する
  3. 次に、コマンドを送信し、応答を待ってから、別のコマンドを送信します。
  4. 送信した2つのコマンドの後、「SNX_COM>」の応答が返されます。
  5. 接続が確立されたら、ボタンをクリックしたときに特定のコマンドを送信するために接続を開いたままにしておきたいです。

^^それは基本的に私のコードが達成すべきことです^^

Javaクラス

package com.smarte.smartipcontrol;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;

public class IPControl extends Activity {

private Socket socket;
private String serverIpAddress = "com.smarte.smartipcontrol.ACTU_IP";
private static final int REDIRECTED_SERVERPORT = 32;
public PrintWriter out;
public BufferedReader in;
public String data;
public Object pd;



public void getModel(View view) {
    try {
        out.println("[m\r\n");
        //System.out.print("root\r\n");
        while(!in.ready());
        String textStatus = readBuffer();

    } catch(IOException e) {}
}


@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   setContentView(R.layout.act_ipcontrol);


   try{   

    new AsyncAction().execute();

   }catch (Exception e) {
       e.printStackTrace();
   }

   }



private class AsyncAction extends AsyncTask<String, Void, String> {
   protected String doInBackground(String... args) { 
   try {
 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
} catch (UnknownHostException e1) {
 e1.printStackTrace();
} catch (IOException e1) {
 e1.printStackTrace();
}
try {
 out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 while (! in .ready());
 readBuffer();
 out.println("root\r\n");
 //System.out.print("root\r\n");
 while (! in .ready());
 readBuffer();
 out.println("root\r\n");
 //System.out.print("root\r\n");
 while (! in .ready());
 String msg = "";

while ( in .ready()) {
 msg = msg + (char) in .read();
}
} catch (IOException e) {}

       return null;//returns what you want to pass to the onPostExecute()
   }

   protected void onPostExecute(String result) {

   //results the data returned from doInbackground

       IPControl.this.data = result;



       }
   }


private String readBuffer() throws IOException {
    String msg = "";

    while(in.ready()) {
        msg = msg + (char)in.read();
    }
    //System.out.print(msg);
    if(msg.indexOf("SNX_COM> ") != -1) return msg.substring(0, msg.indexOf("SNX_COM> "));
    else return msg;
}

}

LogCat...。

12-03 21:56:43.670: E/AndroidRuntime(1231): FATAL EXCEPTION: AsyncTask #1
12-03 21:56:43.670: E/AndroidRuntime(1231): java.lang.RuntimeException: An error occured while executing doInBackground()
12-03 21:56:43.670: E/AndroidRuntime(1231):     at  android.os.AsyncTask$3.done(AsyncTask.java:299)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.lang.Thread.run(Thread.java:856)
12-03 21:56:43.670: E/AndroidRuntime(1231): Caused by: java.lang.NullPointerException
12-03 21:56:43.670: E/AndroidRuntime(1231):     at com.smarte.smartipcontrol.IPControl$AsyncAction.doInBackground(IPControl.java:71)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at com.smarte.smartipcontrol.IPControl$AsyncAction.doInBackground(IPControl.java:1)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-03 21:56:43.670: E/AndroidRuntime(1231):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
12-03 21:56:43.670: E/AndroidRuntime(1231):     ... 4 more
4

1 に答える 1

1

これは、例外を飲み込んだときに発生します...これらの行の1つにNPEがあります(同じ行に両方を貼り付けたため、どちらかはわかりません71):

out = new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(socket.getOutputStream())), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

socketIPControl(とのようinout)のインスタンス変数であり、これは、何らかの理由で接続を確立できない場合、プログラムはスタックトレースを出力して続行することを意味します。

try {
    InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
    socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
} catch (UnknownHostException e) {
    e.printStackTrace();
}
// next of the code

コンソール(またはEclipseコンソール)を注意深く調べると、何が起こっているのか、つまり実際の問題を解決するために何ができるのかがわかります。

tryただし、接続を安定させることができない場合に続行しても意味がないため、実際にはすべてのコードを最初のブロック内に配置する必要があります。

またsocket、、inおよびoutはインスタンス変数である必要はありません-コンテキストを提供しなかったため、これ以上のアドバイスはできません-ただし、これらはアクティビティの残りのコードで再利用されないため、自由にローカル変数にすることができます。最後に、close()完了したらすべてを実行することをお勧めします(これが、インスタンス変数を使用しないもう1つの理由です)。

于 2012-12-03T22:49:37.513 に答える