有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android TCP程序崩溃

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

请原谅,我对安卓系统很陌生。所以我不知道如何调试它。。。但我不会尝试太复杂的事情。最终,我想尝试“使用”应用程序中接收到的字节。让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) 个答案

  1. # 1 楼答案

    emulator的每个实例都运行在一个虚拟路由器/防火墙服务后面,该服务将它与开发机器的网络接口和设置以及internet隔离开来

    每个实例的虚拟路由器管理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. # 2 楼答案

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

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

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

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

    因此,尽管获取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);
    
    }
    
    }
    

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