我的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,防火墙都被禁用了。我从来没有经历过这样的事情,所以任何帮助都是感激的。
1条答案
按热度按时间o7jaxewo1#
有时你只是看不见森林的树木,不得不睡在它上面。。。
问题是我的状况
但是服务器从不关闭连接。。。所以我从来没有退出我的循环,我停留了30秒运行到插座超时。等待30秒后,我的答案在stringbuffer中,但我的readtime当然是30000,所以我抛出异常而不是提供答案。。。我将不得不考虑一个endofpackage字节或者别的什么来避免这种情况。谢谢你的帮助