Java并通过套接字发送文件

时间:2011-11-19 14:45:43

标签: java sockets

我编写了一个客户端 - 服务器应用程序,它将从客户端向服务器发送.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字节。

4 个答案:

答案 0 :(得分:3)

确保在流上调用flush()


  

路人问道:close()不够吗?

您链接到Writer的文档和信息。在close()方法状态..

  

关闭流,首先刷新它。 ..

所以你部分正确,OTOH,OP明显使用OutputStreamclose()状态的文档:

  

关闭此输出流并释放与此流关联的所有系统资源。 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指令,代码应该可以正常工作。