我通过从中获取OutputStream实例来一次性写入SSL套接字上的10000个字节
OutputStrem os = ssl_Socket.getOutputStream();
os是OutputStream。它将数据成功写入服务器,但服务器端收到的数据以某种方式损坏。
但如果我使用BufferedOutputStream,那么everthing工作正常。
os = new BufferedOutputStream(c._s.getOutputStream(), 8196);
我的问题:
答案 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库,也许有一些特定的东西。