【问题标题】:Impossible to read from ouput stream无法从输出流中读取
【发布时间】:2018-04-08 12:16:58
【问题描述】:

我有一个将字符串发送到套接字客户端的服务器。当我尝试从客户端获取字符串的内容时,它不会读取它。 服务器发送方式:

output.write(res); output.flush(); // I checked res content and it is all good

这是客户端接收:

public class Client {
public static void main(String[] args) throws IOException{
    Socket connexion = new Socket(InetAddress.getLocalHost(), 33333);

    BufferedReader input = new BufferedReader(
            new InputStreamReader(connexion.getInputStream(), "8859_1"), 1024);
    String res="";
    while(input.readLine()!=null){
        res += input.readLine()+"\n";
    }
    System.out.println(res);
}}

请给点建议?谢谢

【问题讨论】:

  • 服务器不发送任何换行符。客户期望一个。所以它会阻塞,直到服务器发送一个。

标签: java sockets input output


【解决方案1】:

问题是您正在阅读下一行,然后忽略它,然后尝试再次阅读下一行。第二次读取下一行时,没有数据,因为第一次读取已经消耗了它:

while(input.readLine()!=null){
    res += input.readLine()+"\n";
}

尝试以下方法:

String line = null;
while((line = input.readLine()) != null) {
    res += line + "\n";
}

正如@JB Nizet 提到的,这取决于服务器实际向客户端发送换行符以终止消息。如documentation for readLine()中所述:

读取一行文本。一条线被认为被任何人终止 换行符 ('\n')、回车符 ('\r') 或回车符 紧接着是换行符。

【讨论】:

  • 我试过了。同样的问题。如果我取消 while 循环,则只有第一行 res 会打印在屏幕上
  • while((line = bufferedReader.readLine()) != null) { res+=line+"\n"; } //System.out.println(res); output.write(res);输出.flush();这应该工作!不 ?我在每一行后添加一个 \n
  • 问题可能不是res没有换行符:可能是通过bufferedReader.readLine()从套接字读取的输入不包含换行符,所以readLine调用永远不会回来。请参阅上面引用的文档。
  • 另外,在服务器关闭套接字之前,您的客户端不会打印任何内容。它会关闭套接字吗?你用过你的调试器吗?
  • @AbderrahmenMrabet 服务器发送任何换行符。在客户端中添加换行符无济于事。 服务器需要发送换行符,并关闭套接字。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多