Android TCP - 程序崩溃

时间:2011-01-20 04:42:34

标签: java android tcp client client-server

我似乎无法在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);

    }

}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

通常在Java中,可以抛出异常的相互依赖的语句放在同一个try / catch语句中。最有可能发生的是代码进入你尝试定义新套接字的第一个try catch块。这无法抛出像'UnknownHostException'这样的异常。 connectionSocket保持为null,但代码进入UnknownHostException的catch。您打印堆栈跟踪,但程序不会退出。您的代码将继续执行以下调用

的try / catch块
 PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);

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

因此,即使获取logcat堆栈跟踪会告诉我们更多关于您的问题,您构建的代码应该压缩到一个try / catch语句中,因为所有代码都依赖于第一次try / catch完成而没有错误。 / p>

编辑:

尝试像这样构建你的应用程序

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.