1

有没有简单的方法转标准码:

in = new InputStreamReader(socket.getInputStream());
String message = "";
while ((size = in.read(buf)) != -1){
    message += new String(buf, 0, size);
}

这样read()就不会阻塞。我试着做:

if (!in.ready())
   //throw exception

但这总是抛出异常。也许:

socket.setSoTimeout(120000);
in = new InputStreamReader(socket.getInputStream());

但是,正如下面每个人所说的那样,这不起作用。其他想法?

4

2 回答 2

2

为了“防止阻塞” ...

1)使用NIO(需要使用下面的Channels);或者关于 NIO 用作 MINA、XNIO、xSocket 等的更好的包装器。我不建议直接使用 NIO,因为有很多问题需要处理。

2)使用线程;确保使用标准的线程数据隔离规则来避免令人头疼的问题。ConcurrentLinkedQueue 等并发感知数据结构是您的朋友。

setSoTimeout 不会阻止阻塞;它只是增加了阻塞操作的超时时间。我避免它是因为它有许多“怪癖”。使用风险自负。

于 2009-11-02T01:45:56.583 回答
2

根据支持您的阅读器的 InputStream 类型以及是否为阅读器使用固定长度的字符编码,您可以在支持流上使用可用的方法。对于 InputStream 的大多数实现,available()将返回您可以在不阻塞的情况下读取的字节数。如果字符编码使用每个字符的固定字节数,您就知道可以从 InputStreamReader 读取多少而不阻塞。

于 2009-11-02T00:04:21.123 回答