• JAVA TcpServer端使用Scanner读取不到数据的解决办法


      在使用JAVA进行Socket通信时,在Server端使用Scanner的nextLine()方法读取数据时,一直读取不到数据是因为Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格、回车都算做是空白符。nextInt()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中,但是,nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉。

      在下面的Server端程序中,每次out.println("hello");后要flush一下因为选择了PrintWriter是有缓存的。在输入的字符串中要包含换行符“\r\n”,负责扫描器Scanner扫描不到结束标志:

     1         try {
     2             
     3             ServerSocket server = new ServerSocket(8189);
     4             Socket socket = server.accept();
     5             InputStream in = socket.getInputStream();
     6             OutputStream out = socket.getOutputStream();
     7 
     8             Scanner scanner = new Scanner(in);
     9     
    10             PrintWriter pw = new PrintWriter(out, true);
    11             pw.println("hello");
    12             pw.flush();
    13             
    14             pw.println("world");
    15             pw.flush();
    16             
    17             boolean bStop = false;
    18             while(!bStop&&scanner.hasNextLine()){
    19                 
    20                 String mString = null;
    21                 try{
    22                     mString = scanner.nextLine();
    23                 }catch(Exception e){
    24                     e.printStackTrace();
    25                 }
    26                 
    27                 if (mString.equals("STOP")) {
    28                     bStop = true;
    29                 }
    30                 pw.write(mString);
    31                 pw.flush();
    32             }
    33             
    34         } catch (IOException e) {
    35 
    36             e.printStackTrace();
    37         }
  • 相关阅读:
    单例模式创建
    盛最多水的容器
    魔术索引
    钢条切割
    比较版本号
    矩阵中的路径
    机器人的运动范围
    计网基础问题
    Linux 下android环境的配置
    Fedora15下安装Android开发环境
  • 原文地址:https://www.cnblogs.com/centor/p/5750054.html
Copyright © 2020-2023  润新知