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