我正在用Java套接字实现一个聊天工具。我的重点是一些功能,如身份验证,一个人聊天和群聊。我在考虑添加文件传输功能,我想知道这方面的好做法是什么。我应该在服务器上有单独的套接字,不同的端口只监听文件传输吗?现在,我从服务器套接字获得的输入和输出流分别绑定到扫描仪和PrintWriter对象,因此我发现很难将其用于文件传输。
任何模式,你们可以推荐给我或给我很好的建议,非常感谢。
谢谢,
ZeKoU
发布于 2010-04-21 15:32:24
好吧,FTP为每个文件传输创建一个新的套接字。请注意,可以在与用于聊天的端口相同的端口上建立连接,但使用不同的初始化对话框。
发布于 2012-02-07 07:35:16
如果你可以使用原生库来做这件事,它会更快。如果做不到这一点,除非有一个非常好的理由,否则请使用一个已经解决了所有问题的库。
如果你真的需要用纯Java发送一个文件。这是基于我的一个旧项目的一种方法。但是请注意,有一些序列化开销,但是大部分开销可以通过使用here的NIO等价物来消除,或者您可以更进一步,使用Zero Copy,它允许您告诉OS将文件直接复制到套接字,而不需要任何中间副本。这只适用于文件,而不适用于其他数据。
您应该在单独的线程中执行此操作,以便在传输文件时聊天仍可正常工作。创建一个套接字并为其提供一些标准端口(您可以给它端口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
}
希望这足以让您快速启动并运行文件发送器:)
编辑:删除无意义的语句。增加了原生点和零拷贝的提及。
https://stackoverflow.com/questions/2680993
复制相似问题