第一个bug:
如下android连接服务端的代码:
try {
Toast.makeText(MainActivity.this, "wwwww", Toast.LENGTH_LONG).show();
Socket socket = new Socket("10.55.44.66", 30003);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = br.readLine();
show.setText(str);
br.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
连接不上服务端,要去掉Toast那条语句才可以。
第二个bug:
如下客户端的代码:
try {
ServerSocket ss = new ServerSocket(30003);
while(true) {
Socket socket = ss.accept();
InetAddress inetAddress = socket.getInetAddress();
System.out.println(inetAddress.getHostAddress());
System.out.println(inetAddress.getHostName());
OutputStream os = socket.getOutputStream();
os.write("睡你妈逼,起来嗨!".getBytes("utf-8"));
os.flush();
os.close();
socket.close();
}
} catch (Exception e) {
// TODO: handle exception
}
虽然连接得上服务端,但是会连续打印出两次ip地址,而没有打印.getHostName(),并且数据传输的时候接收不了,要把相应的android程序先放到后台,然后在重新运行,才可以接收数据。但是我把
System.out.println(inetAddress.getHostName());
这句话去掉就不会出现这种情况,一打开程序数据就传输到了android应用中了。很神奇的bug,个位大神们帮我试试咯,服务端和客户端就上面那两段代码
------解决思路----------------------
错误1:Toast应该运行在UI线程, Network操作应该在非UI线程。你这么混用是不对的。
如果你当前线程是非UI线程,那么你应该用handler或runnable去执行toast。
如果你当前线程是UI主线程,那么你应该修改Network相关代码到新线程中执行。
错误2:连续打印出两次ip地址,是因为getHostAddress和getHostname得到的都是ip地址。猜测你的ServerSocket里面写的是ip地址,入参是端口号。
不是所有ip地址都能转换成DNS域名!
而且!getHostname内部DNS解析是需要时间的。20秒超时(Android socket源码中默认值)或者更久。这行代码把你的socket操作挂起了。