开发者社区> 问答> 正文

PrintWriter调用write方法之后使用flush方法获取不到内容

PrintWriter ps= new PrintWriter(socket.getOutputStream());
ps.write( "hello" );
ps.flush();
服务端获取不到hello信息,看了下PrintWriter源码,flush()中调用的是BufferedWriter中的flush(),如果这样的话,应该能刷新缓冲得到结果。但是没有。。。网上找到个说法,原文是这样的"为什么客户端调用了write()和flush()后,服务器端依然read不到数据。因为socket.getOutputStream()取到的实现类是java.net.SocketOutputStream,这个类并没有覆写flush方法,它的父类java.io.FileOutputStream也没有覆写,于是最终就调到了最顶层java.io.OutputStream的flush()方法,这就恶心了,这个方法是空的。于是...",如果这个说法是对的话,为什么我定义的PrintWriter对象会调用SocketOutputStream里面的flush()?如果这个说法不对,那么是什么导致调用write()之后flush()无效?

展开
收起
蛮大人123 2016-02-20 18:59:27 6227 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    public void createClientSocket(){
     try {
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     Socket s = new Socket("127.0.0.1", 9009);
     PrintWriter pw = new PrintWriter(s.getOutputStream());
     String str = br.readLine();
     while(!"quit".equals(str)){
     //这两行server端可以获取str
     // pw.println(str);
     // pw.flush();
     //这两行server端获取不到str
     pw.write(str);
     pw.flush();
     str = br.readLine();
     }
     } catch (UnknownHostException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     }
     }
    public void createServerSocket(){
        try {
            ServerSocket ss = new ServerSocket(9009);
            Socket s = ss.accept();
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String str;
            while((str = br.readLine())!=null){
                System.out.println(str);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    2019-07-17 18:45:42
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载