我编写了一个客户端 - 服务器应用程序,它将从客户端向服务器发送.xml文件。我在发送大数据时遇到问题。我注意到服务器最多可以获得1460个字节。当我发送超过1460字节的文件时,服务器只获得前1460字节而不是更多。实际上我得到了未完成的文件。这是我的代码:
客户端发送:
public void sendToServer(File file) throws Exception
{
OutputStream output = sk.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[1024*1024];
int bytesRead = 0;
while((bytesRead = fileInputStream.read(buffer))>0)
{
output.write(buffer,0,bytesRead);
}
fileInputStream.close();
}
服务器获取:
public File getFile(String name) throws Exception
{
File file=null;
InputStream input = sk.getInputStream();
file = new File("C://protokolPliki/" + name);
FileOutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024*1024];
int bytesReceived = 0;
while((bytesReceived = input.read(buffer))>0) {
out.write(buffer,0,bytesReceived);
System.out.println(bytesReceived);
break;
}
return file;
}
有谁知道这段代码有什么问题?谢谢你的帮助。
编辑:
没有任何帮助:(。我对此有所了解,我认为它可能与TCP MSS相关,等于1460字节。
答案 0 :(得分:3)
确保在流上调用flush()
。
路人问道:
close()
不够吗?
您链接到Writer
的文档和信息。在close()
方法状态..
关闭流,首先刷新它。 ..
所以你部分正确,OTOH,OP明显使用OutputStream
和close()
状态的文档:
关闭此输出流并释放与此流关联的所有系统资源。 close的一般合同是它关闭输出流。封闭流无法执行输出操作,无法重新打开。
OutputStream
的密切方法无效。
(强调我的。)
总结一下。不,在普通close()
上调用OutputStream
将无效,并且可能会被编译器删除。
答案 1 :(得分:3)
以太网的MTU(Maximum Transmission Unit)大约为1500字节。考虑以块的形式发送文件(即一次一行或每次1024字节)。
查看使用1024而不是1024 * 1024的字节缓冲区来解决您的问题。
答案 2 :(得分:3)
尽管与您的问题无关,但API文档表示FileInputStream.read为文件末尾返回-1。您应该使用> = 0作为while循环。
答案 3 :(得分:2)
在服务器端执行的代码中,while循环中有一个break指令。因此,循环中的代码只会执行一次。删除break指令,代码应该可以正常工作。