我正在开发一个在服务器和客户端应用程序之间使用Java套接字的应用程序。我需要通过这些套接字将大小为64k的文件从客户端发送到服务器。当我在本地运行所有系统(服务器和客户端)时一切正常,但是当我在不同的机器上运行服务器和客户端时,它会失败。
我正在使用JSON来处理文件内容,因此服务器中抛出的异常是:“net.sf.json.util.JSONTokener.syntaxError”。但问题不是JSON,而是文件的大小。当我发送大小小于8k的文件时,一切正常,但更大的大小会截断发送的信息,因此当服务器尝试解释截断的接收信息时,它会抛出JSONTokener.syntaxError。
我正在定义一个64k的套接字缓冲区,如下所示(我使用的是NIO API):
SocketChannel sc;
private static final int BUFFER _SIZE = (int)Math.pow(2, 16);
.....
sc.socket().setReceiveBufferSize( BUFFER_SIZE );
sc.socket().setSendBufferSize( BUFFER_SIZE );
在远程模式下运行系统时,如何扩大网络包大小?你知道哪个是问题吗? 非常感谢你提前。
的奥斯卡
答案 0 :(得分:0)
缓冲区大小通常超过64K,因此您实际上可能会缩小它们。
TCP数据包的MTU通常为1.5 KB,更改此值极不可能对您有所帮助。在任何情况下,9000字节是我见过的最多。
您遇到的问题可能在于您编写数据的方式,但我怀疑它在您阅读数据的方式。假设您将收到相同大小的数据或者您将同时收到所有数据,这是一个常见的错误。
除非您拥有包含长度的协议,否则Streams不会“知道”您编写的数据大小,并且您不知道何时收到所有已发送的数据。