美文网首页
[Java]开发安卓,你得掌握的Java知识13.5

[Java]开发安卓,你得掌握的Java知识13.5

作者: 入梦瞌睡 | 来源:发表于2019-08-23 00:00 被阅读0次

    0.前言

    • 上一篇文章我们大致讲述了服务器端与客户端的简单的交互

    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)来帮忙看一看,到底某些语句是否执行

    相关文章

      网友评论

          本文标题:[Java]开发安卓,你得掌握的Java知识13.5

          本文链接:https://www.haomeiwen.com/subject/shposctx.html