如何使用Java套接字实现文件传输?

时间:2010-04-21 07:22:25

标签: java file sockets chat transfer

我正在使用Java套接字进行聊天实现。我专注于一些功能,如身份验证,一人聊天和群聊。我正在考虑添加文件传输功能,我想知道这是什么好方法。我应该在服务器上使用不同的端口监听文件传输吗?我现在从服务器套接字获得的输入和输出流分别绑定到Scanner和PrintWriter对象,因此我发现很难将其用于文件传输。

你们可以推荐的任何模式或给我很好的建议都非常感激。

谢谢,

ZeKoU

2 个答案:

答案 0 :(得分:3)

好吧,FTP为每个文件传输创建一个新套接字。请注意,可以在与用于聊天的端口相同的端口上建立连接,但使用不同的初始化对话框。

答案 1 :(得分:-1)

如果您可以使用本机库,那么它会更快。除非有一个非常好的理由,否则使用一个可以解决所有问题的库。

如果你真的需要用纯Java发送文件。这是基于我的旧项目的单向方式。但是请注意,有一些序列化开销,但是大部分可以通过使用所讨论的here中的NIO等价物来删除,或者您可以稍微进一步使用Zero Copy,这可以让您告诉操作系统复制文件直接发送到没有任何中间副本的套接字。这仅适用于文件而不适用于其他数据。

您应该在单独的线程中执行此操作,以便在文件传输时聊天仍然有效。创建一个套接字并给它一些标准端口(您可以给它端口0,它只选择下一个可用端口,但是您需要将该信息发送给另一个接收者,因此只需使用标准端口就更容易了)。然后将文件拆分为块并使用套接字传输:

//Send file (Server)
//Put this in a thread
Socket socket = new Socket(destinationIP, destinationPort);
ObjectOutputStream sender = new ObjectOutputStream(socket.getOutputStream());
sender.writeObject(dataToSend);

//Receive File (Client)
//Kick off a new thread to receive the file to preserve the liveness of the program
ServerSocket serverSocket = new ServerSocket(ListenPort);
socket = new Socket();
while (true) {
        new Thread(new TCPReceiver(socket)).start();
}

//Receive file thread TCPReceiver(Socket socket)
//Get the stream where the object is to be sent
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

/*  Where type is the type of data you send... String or anything really...
    read part of the file into something and send it then at this end use the same data                                                       
    type to recieve it and it will magically pull the entire object across.
*/
while(fileIsIncomplete){
    type recievedData = (type) objectInputStream.readObject();
    //Reconstruct file
}

希望这足以让您快速启动并运行文件发送者:)

编辑:删除了废话。添加了原生点和零拷贝提示。