【问题标题】:Android TCP - program crashesAndroid TCP - 程序崩溃
【发布时间】:2011-06-12 05:25:09
【问题描述】:

我似乎无法在 java 服务器应用程序和 Android 之间建立简单的 TCP 连接(我已经尝试过模拟器和 Android Dev Phone 2)。我在模拟器上收到此错误“应用程序数据接收(进程 com.mdog.datareceive)已意外停止。请重试。”

请原谅我,但我对 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);

    }

}

【问题讨论】:

  • 您需要实际异常的堆栈跟踪,您可以从 logcat 中获取它,或者使用 Eclipse 中的 DDMS 透视图,或者从命令行使用 adb logcat。
  • 是的,我们需要 stacktrace 和 Mike,我建议您使用 'Log.e' 而不是 'e.printstackTrace()' 来记录错误。

标签: java android tcp client client-server


【解决方案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

【讨论】:

    【解决方案2】:

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

    通常在 Java 中,相互依赖且可能抛出异常的语句被放在同一个 try/catch 语句中。最有可能发生的事情是代码进入了您尝试定义新套接字的第一个 try catch 块。这无法引发类似“UnknownHostException”的异常。 connectionSocket 保持为空,但代码进入了 UnknownHostException 的捕获。您打印堆栈跟踪,但程序没有退出。您的代码继续到您调用的以下 try/catch 块

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

    这会导致 NullPointerException。这是一个未检查的 RuntimeException,因为它未检查,所以您不必在 catch 语句中捕获它。该异常现在会导致您的 VM 崩溃并导致您报告的错误屏幕。

    因此,即使获取 logcat 堆栈跟踪会告诉我们有关您的问题的更多信息,您构建的代码也应该压缩为单个 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 的程序连接到模拟器或设备。如果您只有模拟器并且没有手机连接到您的电脑,请尝试运行以下命令: 亚行日志猫 *:D 这会将日志信息输出到终端。保持此窗口打开并运行您的应用程序。您应该会看到打印了堆栈跟踪。 Please take the time to get to know logcat and adb.

    【讨论】:

    • 如何使用 Android 获取堆栈跟踪?它只是让我的手机崩溃......我希望能够使用一些控制台打印语句或其他东西,这样我就可以更好地了解我哪里出错了。
    • @Mike 我在我的答案中添加了更多内容,希望能解释如何获取更多信息。
    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 2013-11-26
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多