【问题标题】:Transmitting files of 64k size through sockes fails通过 sockes 传输 64k 大小的文件失败
【发布时间】:2012-07-21 02:05:57
【问题描述】:

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

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

奥斯卡

【问题讨论】:

  • 听起来您的阅读代码可能已损坏。不要试图依赖单个数据包中的所有内容,这可能是您目前所希望的......如果这是 TCP,它是一个 stream 协议。

标签: java json sockets buffer


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2015-01-20
    • 1970-01-01
    • 2018-12-01
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多