首页 > 解决方案 > 即使有数据,套接字输入流上也没有数据

问题描述

我的 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,防火墙都被禁用。我从来没有经历过这样的事情,所以任何帮助表示赞赏。

标签: javasocketsinputstream

解决方案


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

问题是我的条件

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

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


推荐阅读