今天复习到写一个文本转化器,客户端发一行字符,服务端转为大写后发回来。

前一天我写的时候,还是没问题的:

import java.net.*;
import java.io.*;public class TCP_Client {public static void main(String[] args) throws Exception {try {Socket tcpClientSocket = new Socket(InetAddress.getLocalHost(),10002);OutputStream out = tcpClientSocket.getOutputStream();InputStream in = tcpClientSocket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s = null;byte[] buf = new byte[1024];int len = 0;while ((s = br.readLine()) != null) {if (s.equals("OVER")) {out.write(s.getBytes());System.out.println("...closing.");Thread.sleep(3000);break;}out.write(s.getBytes());len = in.read(buf);System.out.println("Convert : " + new String(buf, 0, len));}tcpClientSocket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
import java.net.*;
import java.io.*;public class TCP_Server {public static void main(String[] args) throws Exception {try {ServerSocket tcpServerSocket = new ServerSocket(10002);Socket tcpClientSocket = tcpServerSocket.accept();System.out.println(tcpClientSocket.getLocalAddress()+ "...connected.");OutputStream out = tcpClientSocket.getOutputStream();InputStream in = tcpClientSocket.getInputStream();byte[] buf = new byte[1024];int len = 0;while (true) {len = in.read(buf);String s = new String(buf, 0, len);if (s.equals("OVER")) {break;}System.out.println("Get : " + s);out.write((s.toUpperCase()).getBytes());}tcpServerSocket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

过了一天,我用缓冲区技术再做一次,就怎么都不行了,

每次都是客户端连接上后,输入一行字符就卡住了。

通过对比观察,才发现自己之前一直忽略的一个问题:

readLine() 读取一个文本行。

通过下列字符之一即可认为某行已终止:

换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。

因此,上面的方法我是用read()方法来读取,能够读到换行符号,

改为BufferedReader后用readLine()就不行了。

修改后代码如下:

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws UnknownHostException,IOException {Socket tcpClientSocket = new Socket(InetAddress.getByName("localhost"),10004);BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));BufferedReader readIn = new BufferedReader(new InputStreamReader(tcpClientSocket.getInputStream()));BufferedWriter writeOut = new BufferedWriter(new OutputStreamWriter(tcpClientSocket.getOutputStream()));String convertStr = null;while ((convertStr = keyIn.readLine()) != null) {if (convertStr.equals("OVER")) {writeOut.write(convertStr);writeOut.newLine();writeOut.flush();break;}writeOut.write(convertStr);writeOut.newLine();writeOut.flush();System.out.println("After:" + readIn.readLine());}tcpClientSocket.close();}
}
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) throws UnknownHostException,IOException {ServerSocket tcpServerSocket = new ServerSocket(10004);Socket tcpClientSocket = tcpServerSocket.accept();BufferedReader readIn = new BufferedReader(new InputStreamReader(tcpClientSocket.getInputStream()));BufferedWriter writeOut = new BufferedWriter(new OutputStreamWriter(tcpClientSocket.getOutputStream()));String convertStr = null;while (true) {convertStr = readIn.readLine();writeOut.write(convertStr.toUpperCase());writeOut.newLine();writeOut.flush();}}
}

主要看BufferedWriter和BufferedReader的配合使用,其他一些逻辑和操作缺少的请自动忽略。

感谢这个百度知道答案:Java的流中为什么BufferedReader要写入一个newLine()才能换行

25. BufferedReader的readLine()方法相关推荐

  1. BufferedReader的readLine方法

    BufferedReader有一个方法叫readLine(),优点: 1.该方法的作用是每次都读一行,可以省略很多手动拼接buffer的步骤: 2.它比较高效,相对于一个字符/字节地读取.转换.返回来 ...

  2. 关于java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  3. java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  4. java readline 实现_基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现Buff ...

  5. java readline 超时_跳过Java中的BufferedReader readLine()方法

    是否有一种简单的方法可以跳过java中的readLine()方法(如果它花费的时间超过2秒)? 这是我问这个问题的背景: public void run() { boolean looping = t ...

  6. java中readline函数_自定义BufferedReader中read和readLine方法

    BufferedReader中read和readLine方法总结 实例如下所示: package day0208; import java.io.FileReader; import java.io. ...

  7. IO流-ReadLine方法的原理 自定义BufferedReader

    package com.yyq; /** readLine 方法的原理* 无论是读一行,获取读取多个字符其实最终都是在硬盘上一个一个的读取,所以最终使用的都是* read方法一次读一个的发法* 缓冲区 ...

  8. 解决 java BufferedReader.readLine()方法按行读取文件内容中文乱码的问题

    原来的代码如下所示,但是输出的内容都是乱码 public void readLine(String path) {InputStreamReader isr = null;BufferedReader ...

  9. 浅谈BufferedReader中的read()方法和readLine()方法

    浅谈BufferedReader中的read方法和readLine方法 前言:本人比较菜啦,如果有错误,还请大佬指正. 1. read方法 查看API文档我们可以发现BufferedReader类中的 ...

最新文章

  1. LeetCode455 分发饼干(二分法)
  2. SQL Server 查询基础
  3. Android之安全退出应用程序的几种方式
  4. linux安装自带mysql吗_Linux下安装mysql
  5. HTML5应用程序网站视差模板下载
  6. 《Linux内核设计与实现》读书笔记(2)--- 进程管理
  7. python能做什么-Python到底能做什么?
  8. crackme003
  9. scara机器人用户坐标系标定与工具坐标(TCP)标定
  10. linux重装系统步骤 包含raid【主要针对服务器重装】
  11. 居民身份证号码每个数字代表什么
  12. 计算机系统概论备考,《计算机系统导论》复习题3.doc
  13. c1-02西班牙的语言,【图片】考试的同学看过来~DELE-C1两个月准备(实用经验+超详细流程)转【西班牙语吧】_百度贴吧...
  14. Android通用流行框架大全,零基础入门学习android
  15. Alpha阶段敏捷冲刺⑦
  16. RK3588 ssh Failed to start OpenBSD Secure Shell server 以及E: Sub-process /usr/bin/dpkg returned无法下载软件
  17. 用电脑自带的“画图”调整图片大小到100K以下
  18. Altium Designer 20 (5)——排针类元件创建
  19. supported for git 2.9+
  20. 磊科路由器信号按键_磊科无线路由操作手册

热门文章

  1. 哈利波特魔法觉醒把戏坊烟花盒怎么用
  2. Wechaty+node实现表情包转图片链接机器人~
  3. Element-UI表格自定义背景颜色
  4. Python实现全自动购买火车票 抢票回家过年咯
  5. 女大学生开服装店,只用一招当月净赚27万,并持续裂变!
  6. 公司很小的时候,怎么判断未来老板是否能做大做强?
  7. 物联网会是下一个支柱产业吗?
  8. vue中组件之间传值的六种方式(完整版)
  9. html加载图片有超时时间吗,[前端]图片预加载方法
  10. 图片预加载的三种方法