【问题标题】:StringBuffer is not been printed correctly未正确打印 StringBuffer
【发布时间】:2014-07-19 07:41:30
【问题描述】:

我正在尝试从 InputStream 中读取一些数据,然后将它们放入 StringBuffer 中进行打印。

我把这段代码放在main方法中。

我的问题是 StringBuffer 只在我调试代码时打印,当我正常运行时它没有打印。

我的代码:

Socket s = new Socket();
String host = "";
PrintWriter s_out = null;
BufferedReader s_in = null;
InputStream in = null;

s.connect(new InetSocketAddress(host, 23));

//writer for socket
s_out = new PrintWriter(s.getOutputStream(), true);
//reader for socket
s_in = new BufferedReader(new InputStreamReader(s.getInputStream()));
in = s.getInputStream();

if(s.isConnected() == true && s.isInputShutdown() == false && s.isOutputShutdown() == false){
    StringBuffer sb = new StringBuffer();
    boolean found = false;
    char ch;
    int numberOfBytesThatCanBeRead = in.available();

    for(int j = 0; j < numberOfBytesThatCanBeRead; j++){
        ch = (char) s_in.read();
        //System.out.print(ch);
        sb.append(ch);
    }

    System.out.print(sb.toString());

    s_in.close();
    in.close();
    s_out.close();
    s.close();

这个变量的正确值是564,但是我调试代码时才返回,正常运行时返回21。

int numberOfBytesThatCanBeRead = in.available();

所以,我的问题是:为什么我在调试代码的时候,StringBuffer的结果是正确的,而我正常运行的时候却不是?

谢谢!

【问题讨论】:

    标签: java string sockets inputstream bufferedreader


    【解决方案1】:

    您没有在端口上进行循环监听,这意味着您在对方完成发送所有数据之前立即运行并结束。

    当您调试时,这意味着在您尝试阅读之前有足够的时间让所有内容都到达。

    循环读取,等待所需的所有数据到达。

    【讨论】:

    • 谢谢蒂姆。这个循环的结构是什么?
    • 这取决于您使用的协议(您已经定义了一个对吗?;))。通常你只会循环寻找流的结尾。我真的不明白您为什么要进行这种低级套接字编程,但有许多更高级别的库可以为您处理所有这些。
    • 是的蒂姆,我正在使用 Telnet 协议。我试图使用 Telnet 库,但是当我到达 read() 方法的一部分时,线程被阻塞了。于是,我开始使用 Socket,它可以工作了。
    • Telnet 并不是我真正想到的——Telnet 基本上只是 TCP/IP 上的 ASCII。我的意思是 Google Protocol Buffers/HTTP/SOAP/etc 中的协议……甚至只是序列化 java 对象并将它们扔到网络上……
    • 我读了一些关于使用 Telnet 从 InputStream 读取数据的 cmets,几乎每个人都说这很困难。因为 InputStream read() 方法在没有数据可供读取时不返回 -1,所以会阻塞线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2012-10-04
    • 2015-11-23
    • 2017-10-09
    相关资源
    最近更新 更多