在java中一次性写入SSL套接字的数据的最大限制是多少?

时间:2014-11-10 09:01:40

标签: java sockets ssl io

我通过从中获取OutputStream实例来一次性写入SSL套接字上的10000个字节

OutputStrem os = ssl_Socket.getOutputStream();

os是OutputStream。它将数据成功写入服务器,但服务器端收到的数据以某种方式损坏。

但如果我使用BufferedOutputStream,那么everthing工作正常。

os = new BufferedOutputStream(c._s.getOutputStream(), 8196);

我的问题:

  1. 一次性写入SSL套接字的数据是否有限制?
    是否有默认缓冲区大小?
  2. 为什么它与BufferedOutputStream成功合作?由于我必须编写大量数据,所以我不想使用BufferedOutputStream?

2 个答案:

答案 0 :(得分:1)

  

一次性写入SSL套接字的数据是否有限制?

Integer.MAX_VALUE以外没有其他限制。 SSLSocket的输出流将一直阻塞,直到所有数据都已发送,包括加密和打包到必要数量的底层SSL记录中。

  

是否有默认的缓冲区大小?

BufferedOutputStream的默认缓冲区大小为8192. 8196是一个用于缓冲区大小的奇怪数字,但您应该总是在SSLSocket的输出流上使用缓冲流或写入器。否则,如果一次写入一个字节,则可能会导致数据爆炸最多42次

  

为什么它与BufferedOutputStream成功合作?由于我必须编写大块数据,我不想使用BufferedOutputStream?

您不必使用BufferedOutputStream,但即使您正在编写大量数据,也不会受到影响。尽可能绕过缓冲区。

你的问题几乎肯定在接收端。

答案 1 :(得分:-1)

" [TLS]指定固定的最大明文片段长度为2 ^ 14字节。" - 这是16K。

了解" max_fragment_length" TLS扩展可以限制块的大小。

PS:不熟悉Java SSL库,也许有一些特定的东西。