2011-01-20 50 views
0

我似乎得到一个简单的TCP连接之间的Java服务器应用程序和Android(我已经尝试了模拟器和Android Dev Phone 2)。我在模拟器上得到这个错误“应用程序数据接收(进程com.mdog.datareceive)意外停止,请重试。”Android的TCP - 程序崩溃

原谅我,但我对android很新。所以我不知道如何调试它......但我没有尝试任何太复杂的东西。最终,我想尝试“消耗”我在应用程序中收到的字节。并在后台运行TCP ......但现在只需让手机和计算机进行通信就会很好。

如果你能帮助我,那会很棒。

代号为Android的一面:

public class Receive extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TextView tv = new TextView(this); 

     Socket connectionSocket = null; 
     byte[] inputHolderByteArray = new byte[5*1024]; 

     /* Connect to Server */ 
     try { 
      connectionSocket = new Socket("192.168.0.104", 11313); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     /* Send an s to server to start transmission */ 
     try { 
      PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 
      out.print('s'); 
      out.flush(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     /* read server transmission */ 
     try { 
      connectionSocket.getInputStream().read(inputHolderByteArray); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     tv.setText("done"); 
     setContentView(tv); 

    } 

} 
+1

你要实际的异常的堆栈跟踪,你可以从logcat中得到它,无论是在Eclipse中使用DDMS角度来看,或者从命令行使用adb logcat。 – superfell 2011-01-20 04:49:53

+0

是的,我们需要stacktrace&Mike我建议你使用'Log.e'而不是'e.printstackTrace()'来记录错误。 – 100rabh 2011-01-20 05:37:21

回答

0

虽然superfell是正确的,完整的堆栈跟踪将有助于诊断此,根据您的代码/一个可能的问题是,你打破了每条语句把它分开尝试/ catch块。这可能不是你的核心问题(我猜你有一个网络问题),但这是导致系统崩溃的原因。

通常在Java中,相互依赖的可引发异常的语句放在同一个try/catch语句中。最可能发生的情况是代码在您尝试定义新套接字的位置输入您的第一个try catch块。这会抛出一个像'UnknownHostException'的异常。 connectionSocket保持为空,但代码进入UnknownHostException的catch。您打印堆栈跟踪,但该程序不会退出。您的代码继续到您要拨打的以下try/catch块

PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 

这会导致NullPointerException。这是一个RuntimeException,它没有被检查,并且因为它没有被选中,所以你不必在catch语句中捕获它。现在这个异常会导致您的虚拟机崩溃并导致您报告的错误屏幕。

因此,尽管获取logcat stacktrace会告诉我们更多关于您的问题的信息,但您构建的代码应该被压缩为单个try/catch语句,因为所有代码都依赖于第一次try/catch完成而没有错误。

编辑:

尝试构建您的应用程序是这样

public class Receive extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TextView tv = new TextView(this); 

    Socket connectionSocket = null; 
    byte[] inputHolderByteArray = new byte[5*1024]; 

    /* Connect to Server */ 
    try { 
     connectionSocket = new Socket("192.168.0.104", 11313); 
     PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 
     out.print('s'); 
     out.flush(); 
     connectionSocket.getInputStream().read(inputHolderByteArray); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    tv.setText("done"); 
    setContentView(tv); 

} 

} 

当我们说“得到堆栈跟踪”,这意味着你需要使用的Android调试桥连接到模拟器或设备(ADB )和一个名为logcat的程序。如果您只有模拟器并且没有电话连接到您的电脑,请尝试运行以下命令: adb logcat *:D 这会将日志信息输出到终端。保持此窗口打开并运行您的应用程序。您应该看到打印的堆栈跟踪。 Please take the time to get to know logcat and adb.

1

模拟器的每个实例中运行的背后,从您的开发机器的网络接口和设置,并从互联网隔离开一个虚拟的路由器/防火墙服务。

每个实例的虚拟路由器管理10.0.2/24网络地址空间 - 由路由器管理的所有地址在10.0.2形式,其中是一个数字。该空间内的地址由仿真器/路由器预先分配。

你必须引用开发机器的地址为:10.0.2.2而不是192.168.0.104你的情况。如果要引用到另一台机器在你的局域网,那么你可以Use Network Redirections

http://developer.android.com/guide/developing/tools/emulator.html#emulatornetworking