2011-08-18 20 views
0

我目前通过Java套接字发送大量数据,并且我使用Apache Commons IOUtils库使用copyLarge方法复制以发送/接收数据。问题是copyLarge会一直读取,直到输入流返回-1。我抄在下面复制大量数据时重复使用套接字

while (-1 != (n = input.read(buffer))) { 
    output.write(buffer, 0, n); 
    count += n; 
} 

一个片段,此方法将阻塞,直到关闭套接字,但问题是我希望重用插座附加大量的数据。我看到的替代方法是为每个要传输的数据重新打开一个新的套接字,或者编写自己的读取方法来查找流标记的结尾(即换行符)。

我已经写了这样的低级套接字代码已经有一段时间了,但我在这里错过了什么吗?还是有更简单的方法来做到这一点?

+0

实际上并不难,请参阅http://download.oracle.com/javase/tutorial/networking/sockets/ –

回答

3

你知道你发送了多少数据吗?如果是这样,我基本上是长度前缀的消息。

这是好办比使用令牌结束流中,并不必担心逃逸,过阅读等

干净但是,是的,你需要做的事,因为TCP/IP是基于流的协议。除非你有一些指标,以某种方式,你永远不知道是否会有更多的来实现即时。

+0

谢谢。我知道数据的长度。我希望使用IOUtils.copyLarge(或类似的东西)来发送它,因为实现了这样的样板代码,我觉得我不应该再次写它。你知道任何类似的库,但允许指定长度吗? –

+0

@Jeff:我不害怕,但是那个代码应该很容易适应。 –

+0

同意 - 容易适应,只是希望我不必......哦,好吧,猜我会的。谢谢。 –