2010-04-21 51 views
2

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

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

感谢,

ZeKoU

回答

3

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

-1

如果你可以使用本地lib做到这一点,它会更快。否则,除非有充分的理由,否则可以使用一个能够解决所有问题的库。

如果你真的需要用纯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 
} 

希望这是足以让你得到一个快速的文件发送方和运行:)

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

+0

添加序列化的开销不可能比直接在TCP'金属'上运行的FTP更快。 – EJP 2016-12-11 00:46:42

+0

如果纯FTP是可行的,那也是如此。鉴于这是一个Java应用程序,它可能需要在没有本地FTP库的机器上移植。当然,根据我在一台没有锁定的Windows机器上的日期来判断。所以除非你在应用程序中捆绑了一个,否则你不能承担本地的可行性。我写这篇文章已经很长时间了,我不记得我的意思是“提高FTP的速度和效率”,也许和我在编写代码之前尝试的任何lib相比,因为这条代码没有意义。它仍然是纯Java中发送文件或其他任何文件的有效代码。 – feldoh 2016-12-13 16:51:30