【问题标题】:Reusing socket when copying large amounts of data复制大量数据时重用套接字
【发布时间】:2011-08-18 09:25:16
【问题描述】:

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

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

这个方法会阻塞直到socket关闭,但问题是我想重用socket来处理额外的大数据。我看到的替代方法是为每个正在传输的数据重新打开一个新套接字,或者编写我自己的读取方法来查找流标记的结尾(即换行符)。

我已经有一段时间没有编写这样的低级套接字代码了,但是我在这里遗漏了什么吗?或者有更简单的方法吗?

【问题讨论】:

标签: java sockets


【解决方案1】:

您知道在发送之前您有多少数据吗?如果是这样,我基本上会为消息添加长度前缀。

非常比使用流结束标记更容易处理干净,并且不必担心转义、过度读取等。

但是,是的,您需要做一些事情,因为 TCP/IP 是基于流的协议。除非您有一些指示数据结束的指标以某种方式,否则您永远不知道是否还会有更多的数据即将到来。

【讨论】:

  • 谢谢。我知道数据的长度。我希望使用 IOUtils.copyLarge (或类似的东西)来发送它,因为那个实现这样的样板代码,我觉得我不应该再写一次。您是否知道任何类似但允许指定长度的库?
  • @Jeff:恐怕不是随随便便 - 但该代码应该很容易适应。
  • 同意 - 易于适应,只是希望我不必...哦,好吧,我想我会的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2015-05-22
  • 2012-10-13
  • 2023-03-05
  • 2011-10-27
  • 2018-02-13
  • 2014-03-15
相关资源
最近更新 更多