java - 即使有数据,套接字输入流上也没有数据
问题描述
我的 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 或其他东西来避免这种情况。感谢您的帮助
推荐阅读
- r - 绘制澳大利亚各州的叶绿素图
- python - youtube 数据 api 将哪些内容归类为无效关键字?
- typescript - TypeScript 导入:无法加载资源 (404)
- r - 将除第一个字母之外的句子的每个单词大写
- php - 将 WooCommerce 城市字段更改为前端和管理中的下拉列表
- swift - macOS WidgetKit 扩展中的钥匙串错误 -25308 (errSecInteractionNotAllowed)
- r - 提取总年份的百分比并在 r 中明智地分类
- python - 如何在 django 中导入外部 python 文件而不在views.py中引发错误
- django - django 更新查询不工作,但在 shell 中工作
- django - django 模型不在 urls.py 中