Java SocketChannel和FileChannel.transferFrom/To

Java SocketChannel和FileChannel.transferFrom/To,java,sockets,file-transfer,socketchannel,filechannel,Java,Sockets,File Transfer,Socketchannel,Filechannel,我刚刚了解了JavaNIO包和通道,现在,我尝试使用通道编写一个非常简单的文件传输程序。我的目标是摆脱所有这些字节读的东西。作为第一次尝试,我编写了以下服务器代码: public class Server { public static void main(String args[]) throws FileNotFoundException, IOException { String destination = "D:\tmp\received"; i

我刚刚了解了JavaNIO包和通道,现在,我尝试使用通道编写一个非常简单的文件传输程序。我的目标是摆脱所有这些字节读的东西。作为第一次尝试,我编写了以下服务器代码:

public class Server {
    public static void main(String args[]) throws FileNotFoundException, IOException {
        String destination = "D:\tmp\received"; 
        int port = 9999; 
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(9999)); 
        SocketChannel socketChannel = serverSocketChannel.accept(); 
        FileChannel fileChannel = new FileOutputStream(destination).getChannel();
        fileChannel.transferFrom(socketChannel, 0, 32); 
        socketChannel.close();
        serverSocketChannel.close();
    }
}
以及以下客户端代码:

public class Client {
    public static void main(String args[]) throws FileNotFoundException, IOException {
        String fileName = "D:\\dump\\file";
        InetSocketAddress serverAddress = new InetSocketAddress("localhost", 9999); 
        FileChannel fileChannel = new FileInputStream(fileName).getChannel();
        SocketChannel socketChannel = SocketChannel.open(serverAddress); 
        fileChannel.transferTo(0, fileChannel.size(), socketChannel); 
        socketChannel.close();
        fileChannel.close();
    }
}
在预定义端口上传输预定义的32字节文件,而不进行任何错误处理

此程序编译和运行时没有任何错误,但最终不会写入目标文件(“已接收”)

是否有可能用这种技术传输文件,或者我误解了什么?你能告诉我在上面的代码中我做错了什么吗?经过一些研究,我还没有找到任何解决方案,只是找到了使用这种字节方式的代码片段(比如:while(有数据){read 32 byte and write to file})

将这些反斜杠更改为正斜杠。这是一个非法的文件名,可能会引发一个您应该注意到的异常,或者至少它不是一个与您认为正在编写的文件名相同的文件名


您还需要在循环中调用这些传输方法,直到它们传输了您期望的所有内容。这就是为什么它们有一个返回值。检查Javadoc。

Define“未写入”。文件短吗?空的?已创建?32位文件为4字节,但无论文件大小如何,您都试图读取固定的32字节。通常最好将长度与内容一起发送,以便接收者知道要读取多少。@EJP“未写入”表示没有创建文件。该文件应在文件夹D:\tmp中创建,但执行后该文件夹仍为空。@PeterLawrey抱歉,我指的是32字节。我知道发送长度更好,但是这个测试代码应该尽可能的少。所以我硬编码了文件大小。在要发送的文件中,我写了32个ASCII字符,所以它的大小是32字节。谢谢。我完全忽略了这一点。我用前斜杠代替了它们,现在它可以正常工作了。一个简短的问题:如何在StackOverflow将问题标记为“已解决”?只需接受和/或向上投票您认为最有用的答案(如果有)。
"D:\tmp\received"