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

问题描述

我的 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(超时)。

服务器在同一台机器(本地主机)上运行,我们可以向服务器发送数据,但不知何故丢失了答案(仅在 Java 中而不是在 telnet 中)。这是我不知道的一些奇怪的设置吗?我们使用的是 Windows 10 和 Java 8,防火墙都被禁用了。我从未经历过这样的事情,因此感谢您的帮助。

解决方法

有时你只是只见树木不见森林而不得不在上面睡觉......

问题是我的情况

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

但是服务器永远不会关闭连接......所以我从不退出我的循环并且我在套接字超时的情况下卡住了 30 秒。等待 30 秒后,我的答案在 StringBuffer 中,但当然我的 readTime 是 30000,所以我抛出异常而不是提供答案......我将不得不考虑 EndOfPackage Byte 或其他东西来避免这种情况。 感谢您的帮助