【问题标题】:Force close using sockets and AsyncTask使用套接字和 AsyncTask 强制关闭
【发布时间】:2012-12-03 23:43:19
【问题描述】:

大家好……

请在下面查看我的课程代码和我的 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<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) {

   //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

【问题讨论】:

  • out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  • 看我的回答我相信你的错误是因为你的套接字没有正确初始化。
  • 请查看更新后的 LogCat,今天不是我的日子......

标签: java android sockets tcp android-asynctask


【解决方案1】:

我认为你的问题在这里:

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

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

【讨论】:

  • 嗨 Slezadav,是的,你是对的。但仍然得到一个力量接近。请查看更新的 LogCat。
  • 现在你的问题在第 51 行,我猜是 this.pd = ProgressDialog.show(this, "Loading..", "Please Wait...", true, false);尝试删除它一段时间。
  • 或者更可能发生崩溃,当您旋转屏幕时,因为正在重新创建活动并且您的 ProgressDialog 泄漏。
  • @ChrisJamesHancocks 克里斯。很明显,您的代码存在多个问题,而且我怀疑您在可以走路之前尝试运行,这可以通过您在不了解基础知识时尝试使用高级技术来证明。我是否可以恭敬地建议更好地利用每个人的时间,尤其是您的时间,让您了解导致 nullPointerException 的原因、如何在 logcat 中找到确切的源以及如何调试和修复它。如果没有这些基本技能,您将继续感到沮丧,并且您可能会以效率低下、难以维护的代码告终。祝你好运。
  • @Simon 嗨,西蒙,是的,我肯定想在我能走路之前跑步。我以为我会直接跳入深渊并希望最好。不过,我正在慢慢取得进展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
相关资源
最近更新 更多