使用套接字和AsyncTask强制关闭

你好堆栈的人….

请在下面查看我的课程代码和我的LogCat …

在尝试连接时,我正在关闭力量。 如果有人能帮助我弄清楚为什么会非常感激。

基本上代码正在做的是:

  1. 从意图中获取IP地址。
  2. 使用端口32连接到IP
  3. 然后发送命令,等待响应并发送另一个命令。
  4. 在我发送的2个命令后,我应该得到“SNX_COM>”的响应
  5. 建立连接后,我希望连接保持打开状态,以便在按钮单击时发送特定命令。

请帮忙 :)

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.app.Dialog; import android.app.ProgressDialog; 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{ this.pd = ProgressDialog.show(this, "Loading..", "Please Wait...", true, false); new AsyncAction().execute(); }catch (Exception e) { e.printStackTrace(); } } private class AsyncAction extends AsyncTask { 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) { //resultis the data returned from doInbackground IPControl.this.data = result; if (IPControl.this.pd != null) { ((Dialog) IPControl.this.pd).dismiss(); } } } 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 15:39:56.346: E/AndroidRuntime(2697): FATAL EXCEPTION: AsyncTask #5 12-03 15:39:56.346: E/AndroidRuntime(2697): java.lang.RuntimeException: An error occured while executing doInBackground() 12-03 15:39:56.346: E/AndroidRuntime(2697): at android.os.AsyncTask$3.done(AsyncTask.java:299) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 12-03 15:39:56.346: E/AndroidRuntime(2697): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.lang.Thread.run(Thread.java:856) 12-03 15:39:56.346: E/AndroidRuntime(2697): Caused by: java.lang.NullPointerException 12-03 15:39:56.346: E/AndroidRuntime(2697): at com.smarte.smartipcontrol.IPControl$AsyncAction.doInBackground(IPControl.java:71) 12-03 15:39:56.346: E/AndroidRuntime(2697): at com.smarte.smartipcontrol.IPControl$AsyncAction.doInBackground(IPControl.java:1) 12-03 15:39:56.346: E/AndroidRuntime(2697): at android.os.AsyncTask$2.call(AsyncTask.java:287) 12-03 15:39:56.346: E/AndroidRuntime(2697): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 12-03 15:39:56.346: E/AndroidRuntime(2697): ... 4 more 

我认为你的问题在这里:

  InetAddress serverAddr = InetAddress.getByName(serverIpAddress); socket = new Socket(serverAddr, REDIRECTED_SERVERPORT); 

我找不到serverIpAddress的分配位置,因此您获得NullPointerException。