开发者社区 问答 正文

Java中socket.getInputStream()后进行写的一个问题:报错

新人,见谅,源码在底部;

 

  • 问题描述

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();
            }

        }
    }
}

 

 

 

展开
收起
kun坤 2020-06-07 14:51:34 1273 分享 版权
1 条回答
写回答
取消 提交回答
  • 一、网络模式

    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"才会返回。

    2020-06-07 14:51:40
    赞同 展开评论
问答分类:
问答地址: