所以我有这个我在eclipse中测试的客户端代码,它在那里工作
try {
// Establish connection
Socket socket = new Socket(InetAddress.getByName("192.168.1.104"), 9000);
// Request data
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
msg = "IDGN:" + "1";
System.out.println(msg);
outputStream.write(msg.getBytes());
socket.shutdownOutput();
scanner = new DataInputStream(inputStream);
restaurante = scanner.readUTF();
System.out.println(restaurante);
// Shut down socket
socket.shutdownInput();
socket.close();
} catch (IOException io) {
io.printStackTrace();
}
但是,当我尝试在我的Android应用程序中执行相同操作时,它会崩溃
try {
// Establish connection
Socket socket = new Socket(InetAddress.getByName("192.168.1.104"), 9000);
// Request data
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
msg = "IDGN:" + "1";
outputStream.write(msg.getBytes());
socket.shutdownOutput();
scanner = new DataInputStream(inputStream);
restaurante = scanner.readUTF();
View b = findViewById(R.id.texto);
b.setVisibility(View.VISIBLE);
String ss = "Valore el servicio recibido en: " + restaurante;
((TextView) b).setText(ss);
// Shut down socket
socket.shutdownInput();
socket.close();
}catch (IOException io) {
io.printStackTrace();
}
我只是不知道为什么,我试图让它等待数据准备好,将其更改为OutputStream并从扫描仪读取一行,直接从OutputStream读取字节。
在这两种情况下(Android和Eclipse),服务器似乎都收到了数据,并发送了正确的答案。
您不能在同一个线程中同时拥有网络I / O和UI操作,例如TextView#setText()
。尝试在UI线程上执行网络I / O会导致NetworkOnMainThreadException
。尝试在非UI线程上执行UI操作会导致CalledFromWrongThreadException
。猜猜你的代码正在崩溃其中一个。
有一些先进的线程机制,如rxjava调度程序或kotlin协同程序。如果不添加额外的库依赖项,您可以尝试将网络代码移动到AsyncTask
。
也可以看看:
完成后关闭或刷新输出流。我认为这会导致内存泄漏