我已经阅读了java文档和一些相关问题,但我不确定以下内容是否可以保证有效:
我在专用线程上有一个DataInputStream,它从一个非常活跃的连接中不断读取已知字节大小的少量数据。当流变为非活动状态(即网络中断)时,我想提醒用户,所以我实现了以下内容:
<main class="container">
<form>
<ul class="row">
<li class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
<fieldset>
<label class="label">Firstname</label>
<input type="text" value="Firstname" class="form-input form-control" />
</fieldset>
<fieldset>
<label class="label">Lastname</label>
<input type="text" value="Lastname" class="form-input form-control" />
</fieldset>
</li>
<li class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
<fieldset>
<label class="label">Username</label>
<input type="text" value="Username" class="form-input form-control" />
</fieldset>
<fieldset>
<label class="label">Password</label>
<input type="password" value="Password" class="form-input form-control" />
</fieldset>
</li>
</ul>
</form>
</main>
available()的文档说明:
返回估计可以从此输入流读取(或跳过)的字节数,而不会被此输入流的方法的下一个调用方阻塞。下一个调用者可能是同一个线程或另一个线程。 单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
这是否意味着下一次读取(在readInt()内部)可能只读取2个字节,后续读取完成检索整数可能会阻塞?我意识到readInt()是一个'next next'流的方法,但我认为它必须在读取调用上循环,直到它获得4个字节并且文档没有提到后续调用。在上面的例子中,即使waitOnStreamForState(stream,4)返回STREAM_STATE_ACTIVE,readInt()调用仍然可能会阻塞?
(是的,我意识到我的超时机制并不准确)
答案 0 :(得分:0)
这是否意味着下一次读取(在readInt()内部)可能只读取2个字节,后续读取完成检索整数可能会阻塞?
它说的是什么。但至少下一个read()
赢了。
我意识到readInt()是一个流的方法,被称为“下一个”流。但我认为它必须循环读取调用,直到它获得4个字节并且文档不提及后续调用。在上面的例子中,即使waitOnStreamForState(stream,4)返回STREAM_STATE_ACTIVE,readInt()调用仍然可以阻塞吗?
它说的是什么。
例如,考虑使用SSL。您可以看出有可用的数据,但是如果没有实际删除它就无法说明多少,因此JSSE实现可以免费使用:
available()
返回0(这是以前的做法)available() > 0
,则available()
值,如果实际明文数据较少,则依赖此措辞使其免于麻烦。 (但是,如果密码数据完全由握手消息或警报组成,则正确的值可能仍为零。)但是你不需要这些。您只需要一个读取超时,通过Socket.setSoTimeout()
设置,catch
设置为SocketTimeoutException
。 available()
的正确用法很少:随着时间的推移越来越少,在我看来。你当然应该不浪费时间来调用sleep()
。