zoukankan      html  css  js  c++  java
  • 使用readLine()方法遇到的坑

    • 程序很简单,客户段从控制台读取用户输入,然后发送至服务器端,主要代码如下

    • 服务端代码:

    • 客户端代码:

       结果运行的时候,当开启服务端和客户端后,在客户端的控制台 键盘输入 内容,服务端却没有显示内容

    原因:

    1.原来readLine()方法在进行读取一行时,只有遇到回车( )或者换行符( )才会返回读取结果,这就是“读取一行的意思”,重要的是readLine()返回的读取内容中并不包含换行符或者回车符;

    2.由于在客户端使用的readLine()来读取用户输入,所以当用户按下回车键是,readLine() 返回读取内容,但此时返回的内容并不包含换行符(查看readLine()源码,会将 , 或者 去除掉),而当在服务器端用readLine()再次读取时,由于读取的内容没有换行符,所以readLine()方法会一直阻塞等待换行符,这就是服务器端没有输出的原因。


    解决方法:

    在客户端每次输入回车后,手动给输入内容加入" "或" ",再写入服务器;


    注意:

    1、误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null。没有数据时会阻塞,在数据流异常或断开时才会返回null

    2、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。
    如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。
    3、使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞

  • 相关阅读:
    Intern Day7
    Intern Day7
    Intern Day7
    Intern Day6
    Intern Day6
    Intern Day6
    Intern Day6
    Intern Day6
    萧萧远树疏林外,一半秋山带夕阳
    飞线
  • 原文地址:https://www.cnblogs.com/jpfss/p/9789793.html
Copyright © 2011-2022 走看看