2012-07-20 237 views
0

我正在开发一个在服务器和客户端应用程序之间使用java套接字的应用程序。我需要通过这些套接字将大小为64k的文件从客户端发送到服务器。当我在本地运行所有系统(包括服务器和客户端)时,一切正常,但是当我在不同的计算机上运行服务器和客户端时,它会失败。通过套接字传输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); 

什么我需要做的,当我在一个偏僻的模式下运行我的系统,以扩大网络的封装尺寸?你有什么想法是哪个问题? 非常感谢您提前。

奥斯卡

+3

听起来像您的阅读代码可能已损坏。不要试图依赖单个数据包中的所有内容,这可能是目前你所希望的......如果这是TCP,它就是一个* stream *协议。 – 2012-07-20 17:59:31

回答

0

缓冲区大小通常超过64K,所以你可能会真正缩小它们。

TCP数据包的MTU通常为1.5 KB,并且改变这种情况极不可能对您有所帮助。无论如何,9000字节是我见过的最多的。

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

流不会“知道”你写的数据的大小,你不知道何时收到所有发送的数据,除非你有一个包含长度的协议。