0

我正在开发一个在服务器和客户端应用程序之间使用 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 );

当我在远程模式下运行我的系统时,我需要做什么来扩大网络包的大小?你知道哪个是问题吗?非常感谢您提前。

奥斯卡

4

1 回答 1

0

缓冲区大小通常超过 64K,因此您实际上可以缩小它们。

TCP 数据包的 MTU 通常为 1.5 KB,更改此值不太可能对您有所帮助。无论如何,9000 字节是我见过的最多的。

您遇到的问题可能出在您写入数据的方式上,但我怀疑它出在您读取数据的方式上。假设您将收到与您发送的相同大小的数据,或者您将一次收到所有数据,这是一个常见的错误。

流不“知道”您写入的数据大小,并且您不知道何时收到所有发送的数据,除非您有包含长度的协议。

于 2012-07-20T18:05:03.463 回答