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 }