AsyncTask的TCP / IP连接问题

时间:2012-12-03 22:30:16

标签: java android tcp android-asynctask telnet

  

可能重复:
  Force close using sockets and AsyncTask

喜欢堆叠的人......

请请帮助我,我正在失去理智。

请参阅代码和logcat .....

基本上代码的作用是:

  1. 从意图中获取IP地址。
  2. 使用端口32连接到IP
  3. 然后发送命令,等待响应并发送另一个命令。
  4. 在我们发送的2个命令后,我应该收到“SNX_COM>”
  5. 的回复
  6. 建立连接后,我希望连接保持打开状态,以便在点击按钮时发送特定命令。
  7. ^^这基本上是我的代码应该实现的目标^^

    Java Class

    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
    

1 个答案:

答案 0 :(得分: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块中,因为如果无法建立连接,则继续没有任何意义。

此外,socketinout不应该是实例变量 - 我们无法提供进一步的建议,因为您没有提供上下文 - 但是因为这些不会在在Activity的其余代码中,您可以自由地使它们成为局部变量。最后,当你完成时close()一切都是好的做法(这是不使用实例变量的另一个原因)。