【问题标题】:Java socket BufferedReader read not readingJava socket BufferedReader 读不读
【发布时间】:2014-12-04 22:14:32
【问题描述】:

我试图通过 BufferedReader 和 Buffered Writer 建立客户端/服务器套接字连接,但读取器没有读取任何内容,它只是挂起,客户端发送和刷新正确。 服务器不会抛出任何异常,就好像客户端没有向服务器发送任何内容一样。

我的头要爆炸了……

我对客户端和服务器都使用相同的:

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

这是服务器的代码:

//inside of try catch
while(true){
          while(!in.ready())// just to debug
            System.out.println("READY: " + in.ready()); //just to debug
          System.out.println("READY: OK"); //just to debug
            msg = receive().toString(); //hangs here...
            System.out.println("KEYIS: " + msg);
           ///some stuff to do ....

public StringBuilder receive() throws IOException {
    StringBuilder str = new StringBuilder();
    int tmp;
    while(true){
        tmp = in.read();
        if(tmp == 0)
            break;
        else if(tmp == -1)
            throw new IOException();
        str.append((char)tmp);
    }
    return str;
}

客户端代码:没有挂在这里

 //inside of try catch
         send(KEY); //sended properly, no exception
         while(true){
             send(KEY); // sended properly, no exception
             System.out.println("sent");
             //System.out.println(receive().toString());
         }

public void send(String str) throws IOException{
    out.write(str + "\n"); //
    //out.newLine(); //tried too, not helped
    out.flush(); //push message to server
}

【问题讨论】:

  • 为什么要使用BufferedReader?尝试删除它,这应该会有所帮助。
  • 根据发帖人下方的answer,这是由拼写错误引起的,无法重现。我投票结束这个问题。

标签: java sockets


【解决方案1】:

服务器等待if(tmp == 0),即0 为nil,客户端永远不会发送它。
我认为您正在等待\n,它不是 0,而是 10(换行)。
只是想知道为什么不使用DataOutputStream#writeUTF()DataInputStream#readUTF()

【讨论】:

  • \0用于判断数据是否结束,-1表示连接出错。
  • readUTF不能被lua程序解析,也会连接到服务器
  • @Bob 不,一个 IOException 表示连接出错。 -1 表示对等方已关闭 连接。没有错误。
【解决方案2】:

您正在编写行,但您有一个非常无意义、精心制作且非常错误的输入法,它实际上并没有读取行,并且在流结束时抛出了错误的异常。

试试BufferedReader.readLine(),别忘了测试null。

【讨论】:

  • 我必须传递可能包含\n \r字符的数据,所以不能使用readLine
  • 那么使用BufferedInputStream.read(),不要使用String作为二进制数据的容器。
【解决方案3】:
    StringBuffer sb = new StringBuffer();
    int i;
    while ((i = bi.read()) != -1) {
        char c = (char) i;
        sb.append(c);
        
    }
    return sb.toString();

【讨论】:

    【解决方案4】:

    解决了这个问题...太愚蠢的错误...我只是忘记添加一个 \0 来确定消息的结尾,所以接收方法正在等待,好像更多数据即将到来...

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多