[Java]开发安卓,你得掌握的Java知识13.5
0.前言
- 上一篇文章我们大致讲述了服务器端与客户端的简单的交互
这篇文章是上一篇文章的补充,推荐没有看过上一篇文章的读者先去看一下《[Java]开发安卓,你得掌握的Java知识13》
作为补充篇,本文格式与正篇比较不同
由于最终目的是要开发安卓app,
因此这里使用的IDE是AS(Android Studio)
(不会使用的可以参考下面这篇文章中的例子)
《[Java]开发安卓,你得掌握的Java知识2》
1.关于输入输出流的使用
BufferedReader与BufferedWriter与PrintStream
- 在之前的代码中,我们是使用BufferedReader与PrintStream来进行输入输出的
BufferedReader br
= new BufferedReader(new InputStreamReader(socket.getInputStream));
这句话挺长的,这里解释一下为什么会这么长:
BufferedReader是缓冲字符输入流,
其构造方法BufferedReader()中的参数,需要是Reader类型的socket.getInputStream,可以使我们获得发送过来客户端(或者是服务器端)的数据,但是它返回的是InputStream
想要把socket.getInputStream的InputStream变为Reader,就得使用new InputStreamReader()
BufferedReader br
= new BufferedReader(new InputStreamReader(socket.getInputStream));
String line = null;
while((line = br.readLine()) != null){
System.out.Println(line);
}
String line是用来装br读入的内容的
要注意,br的readLine()返回的是字符串,但是read()返回的是整型(表示读了多少)
- BufferedWriter同理:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line = "abc";
bw.write(line);
- 但是为了方便测试,我们可以考虑使用PrintStream:
String line = "abc\n";
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(line);
- 记得关闭输入输出流(尤其是输出流),不关闭的话,会导致输出的内容传不过去(会留在缓冲区而不会实际发过去)
2.关于多线程的调试
多线程的调试相对来说比较麻烦,原因是要同时启动两个main函数,两个main都要单击左边的绿色小箭头选择DeBug模式
- 在非主线程中的代码,在打上断点后,需要右键断点,然后选择All,这样才能在需要的时候停在该线程的指定位置
- 两个main函数并不会共用内存空间,所以static静态变量并不能在两个main之间共用
要想共用只能使用socket传递- 有很多时候,多线程情况下的DeBug调试未必会有想要的结果,在指定的地方插入System.out.println("具体内容");效果可能会更好
3.总结
(1)通过Socket的交互其实并不难,虽然代码看似复杂,但实际上来来去去就是那么些东西,多些几遍就熟悉了,或者将这部分代码直接封装起来(就像上一篇文章中的MessageManager中的两个函数一样),然后直接在线程中调用即可
(2)多线程的调试会比单独的一个main函数的调试要麻烦,尤其涉及到交互方面的多线程调试可能尤为头疼。原因是某些语句会在必要时刻阻塞线程,很容易因此看不清具体情况。
除了DeBug模式以外,还要多一点使用终端输出(System.out.println)来帮忙看一看,到底某些语句是否执行