java—即使有数据,套接字输入流上也没有数据

uqjltbpv  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(240)

我的java套接字和连接有问题。似乎我的输入流不读取任何数据,即使流上有数据。下面是我们如何读取数据的示例:

InputStream is = socket.getInputStream();
StringBuffer buf = new StringBuffer();
final int SO_TIME = 2500;
socket.setSoTimeout(SO_TIME);
long readTime = 0;
boolean remoteSocketClosed = false;

//Read data while the Remote-Socket is opened and the timeout is OK
while (!remoteSocketClosed && readTime < 30000)
{
    try
    {
        int c = is.read();

        if (c != -1)
        {           
            buf.append((char)c);
        }
        else //c==-1
        {
            remoteSocketClosed = true;
        }
    }
    catch (SocketTimeoutException socketTimeout)
    {
        readTime += SO_TIME;
    }
}

if (readTime >= 30000)
{
    throw new IOException("No answer from server after request (" + readTime +"ms )");
}
else
{
    if (buf.length() > 0)
    {                       
        return buf;
    }
    else
    {
        return null;
    }
}
finally
{
    try
    {
        if (socket!=null)
            socket.close();
    }
    catch (Exception e)
    {
        l.error("Socket not closed", e);
    }

    try{Thread.sleep(250);}catch(Exception e){}
}

现在我觉得这很好。但是,当流中有数据时,它将不会被提取。我可以使用telnet并看到数据正在该连接上传入,而java只是抛出ioexception(超时)。
服务器运行在同一台机器(localhost)上,我们可以向服务器发送数据,但是答案不知怎么地丢失了(只在java中,不在telnet中)。这是我不知道的奇怪的场景吗?我们使用的是windows10和java8,防火墙都被禁用了。我从来没有经历过这样的事情,所以任何帮助都是感激的。

o7jaxewo

o7jaxewo1#

有时你只是看不见森林的树木,不得不睡在它上面。。。
问题是我的状况

if (c != -1)
{           
    buf.append((char)c);
}
else //c==-1
{
    remoteSocketClosed = true;
}

但是服务器从不关闭连接。。。所以我从来没有退出我的循环,我停留了30秒运行到插座超时。等待30秒后,我的答案在stringbuffer中,但我的readtime当然是30000,所以我抛出异常而不是提供答案。。。我将不得不考虑一个endofpackage字节或者别的什么来避免这种情况。谢谢你的帮助

相关问题