readLine方法的简单练习,回答2016-04-27 的帖子的问题
来源:互联网 发布:陈田村拆车件淘宝店 编辑:程序博客网 时间:2024/04/30 13:29
需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转成大写,再返回给客户端,
而且客户端可以不断的进行文本转换,当客户端输入over是,转换结束。
public class TCPDemo02 {//客户端
public static void main(String[] args) {try {
Socket socket=new Socket("172.60.20.120",10005);
//定义读取键盘数据的流对象
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//定义目的。将数据写入到socket输出流,发给服务端
BufferedWriter bufout=
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=null;
while ((line=bufr.readLine())!=null) {
//4.这是readlIne方法的解读,若服务器端程序不写newLine方法,则它在这个方法时,
就会发生阻塞,
if ("over".equals(line)) {break;
}
bufout.write(line);
bufout.newLine();
//1.必须要加,如果不加newline方法,那么不会写入换行符,同时服务器端不会读到换行符
bufout.flush();//记得刷新
System.out.println("server"+str);
}
bufr.close();
socket.close();//加个-1
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TCPServerDemo02 {//服务器端
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(10005);
Socket socket=server.accept();
String ip=socket.getInetAddress().getHostAddress();
System.out.println(ip+"-----connected");
//读取socket读取流中的数据。
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
//目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
BufferedWriter bufOut=
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line=null;
while ((line=bufIn.readLine())!=null) {
//2.Reads a line of text. A line is considered to be terminated by any one
of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed
immediately by a linefeed.
这时readlIne方法的解读,若客户端程序不写newLine方法,则它在这个方法时,就会
发生阻塞,
bufOut.write(line.toUpperCase());
bufOut.newLine();
//3.必须要加,如果不加newline方法,那么jiu不会写入换行符,同时客户端不会读到换行符
bufOut.flush();
}
socket.close();//客户端关掉
server.close();//服务端关掉
} catch (IOException e) {
e.printStackTrace();
}
}
}
用这个对象可以代替BufferedWriter对象,
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
因为这个对象可以使用println方法,相对来说代码会少一些
总结:
该例子出现的问题。
现象:客户端和服务端倒在莫名的等待。
原因:因为客户端和服务端都有阻塞式方法。这些方法没有读到结束标记,那么就一直等待,
从而,导致两端都在等待
虽然帖子晚了几分钟,但是小妞在睡觉之前补上了
- readLine方法的简单练习,回答2016-04-27 的帖子的问题
- readLine()阻塞的问题
- 课堂练习 : 自己模拟 readline 方法的内部实现
- 在论坛发帖应该注意的问题——为什么你的帖子没有人回答?
- 简单的回答
- 一篇回答了地震以来大部分问题的帖子(转)
- DataInputStream的过期方法readLine()
- eclipse的问题帖子
- 关于Console.ReadLine()的问题
- 调用readLine的乱码问题
- android socket readline()方法读不到值的问题
- 使用BufferReader类的readLine()方法注意问题
- 回答你的问题
- 回答GB的问题~
- 回答问题的策略
- 回答问题的智慧
- 回答问题的飞鸽传书
- IOS下的readLine方法的实现
- POJ_1084_SquareDestroyer(DancingLinksX重复覆盖)
- L1 L2正则化
- python错误
- 解决ajax不能访问本地文件(利用js跨域原理)
- Node.js
- readLine方法的简单练习,回答2016-04-27 的帖子的问题
- HDU 1542 Atlantis
- zabbix3.0 监控mysql服务器性能实现过程
- 课堂笔记之线程池
- Lab4: bootloader
- POJ_3074_Sudoku(DancingLinksX精确覆盖)
- htoi(十六进制转十进制)
- AFN
- Spark学习三:Spark Schedule以及idea的安装和导入源码