新人,见谅,源码在底部;
DEMO作用:SocketServer接受localhost:80的消息,将获得的消息打印到F:\\tmp\\output.txt
用浏览器访问localhost:80,一开始好好的,但打印请求头到最后一行的时候,就会停止了,停在while ((str = input.readLine()) != null)这行,由于没有out.flush(),文件里面也没有内容,请大神指点下,这是什么原因。
图1 获取文件头一开始也没问题

图2 读取到这个以后,debug再走下一步就没反应了

package com.demo.server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by Administrator on 2018/5/5 0005.
*/
public class MyServer {
public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(80);
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
System.out.println("开始等待......");
Socket socket = server.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("F:/tmp/output.txt")));
String str = null;
while ((str = input.readLine()) != null) {
out.println(str);
}
System.out.println("每次请求都到不了这里");
out.flush();
out.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
一、网络模式
1、在网络上,readLine()是阻塞模式,也就是说如果readLine()读取不到数据的话,会一直阻塞,而不是返回null,所以如果你想要在while循环后执形相关操作是不可能的,因为while()里面是一个死循环,一旦读不到数据,它又开始阻塞,因此永远也无法执形while()循环外面的操作,所以应该把操作放在while循环里面。
2、在while()里面判断readLine()!= null的时候要赋值给一个String,因为如果不为null,那么这时候已经读了一行。如果用while (br.readLine()!=null),那么下面没法再获取到这一行,所以应该用
while ((line = br.readLine())!=null){}
3、readLine()通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行,所以我们在发送数据的时候要再后面加上这些标志符,否则程序会阻塞。
4、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。
二、读取文件模式:
1、readLine()什么时候才会返回null呢?读取到文件等的结尾时候。(注意和网络上的是不一样的)。
如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。