【问题标题】:PrintWriter won't writePrintWriter 不会写
【发布时间】:2017-02-21 14:53:21
【问题描述】:

我有以下问题。 我编写了一个简单的 Echo Server 和 Echo Client,但问题是在服务器的循环中,我从 Buffered Reader 读取,程序卡住并且不会写入。

    import java.net.*;
import java.util.*;
import java.io.*;
public class SimpleServer {
  public static void main(String[] args) {
    System.out.println("Dies ist ein simpler Echo Server");
    int port = 6000;
    try {
      ServerSocket server = new ServerSocket(port);                       
      //server.setSoTimeout(30000);                                       
      System.out.println("Warte auf anfrage");                            
      Socket client = server.accept();                                   
      InputStream is = client.getInputStream();          
      InputStreamReader isr = new InputStreamReader(is);                  
      BufferedReader reader = new BufferedReader(isr);                   
      String message = null;                                              
      while ((message = reader.readLine())!=null) {                       
        System.out.println("Nachricht vom Client "+message);              
      }
      OutputStream os = client.getOutputStream();                        
      PrintWriter writer = new PrintWriter(os);                          
      System.out.println(message);
      writer.println(message);                                           
      writer.flush();                                                    

      writer.close();                                                    
    } catch(IOException e) {
      e.printStackTrace();
    }  // end of try
  } // end of main
} // end of class SimpleServer

但是当我将.println() 和.flush() 放入循环中时,一切正常。

import java.net.*;
import java.util.*;
import java.io.*;
public class SimpleServer {
  public static void main(String[] args) {
    System.out.println("Dies ist ein simpler Echo Server");
    int port = 6000;
    try {
      ServerSocket server = new ServerSocket(port);                       
      //server.setSoTimeout(30000);                                       
      System.out.println("Warte auf anfrage");                            
      Socket client = server.accept();                                    
      InputStream is = client.getInputStream();                            
      InputStreamReader isr = new InputStreamReader(is);                 
      BufferedReader reader = new BufferedReader(isr);                        
      OutputStream os = client.getOutputStream();                         
      PrintWriter writer = new PrintWriter(os);                          
      String message;                                                     
      while ((message = reader.readLine())!=null) {                       
        System.out.println("Nachricht vom Client "+message);              
        writer.println(message);                                           
        writer.flush();                                                     
      } 
      writer.close();                                                     
    } catch(IOException e) {
      e.printStackTrace();
    }  // end of try
  } // end of main
} // end of class SimpleServer

我的问题是为什么它卡在循环中?

【问题讨论】:

    标签: java network-programming bufferedreader printwriter


    【解决方案1】:

    在发送任何内容之前,您正在阅读 inpit 直到流结束。套接字上的流结束仅在对等方关闭连接时发生。对等方尚未关闭连接,因为他想从中读取您的回复。

    您应该在阅读时回显每一行,而不是尝试将它们全部组合起来,然后将它们全部回显在一个大块中。你的技术除了行不通之外,还浪费时间和空间。

    【讨论】:

    • 感谢您的回答。是的,我希望 Stream 为空时会给出 null 。但是当然,这没有任何意义。但是要阅读长度和行数可变的文本。是否有类似Scanner 方法hasNext() 的东西。为了提供当读取所有文本时服务器退出循环?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多