这是接收文件的服务器代码
public void receive(){
try {
DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
//read the number of files from the client
int number = dis.readInt();
ArrayList<File>files = new ArrayList<File>(number);
System.out.println("Number of Files to be received: " +number);
//read file names, add files to arraylist
for(int i = 0; i< number;i++){
File file = new File(dis.readUTF());
files.add(file);
}
int n = 0;
byte[]buf = new byte[4092];
//outer loop, executes one for each file
for(int i = 0; i < files.size();i++){
System.out.println("Receiving file: " + files.get(i).getName());
//create a new fileoutputstream for each new file
FileOutputStream fos = new FileOutputStream("C:\\users\\tom5\\desktop\\salestools\\" +files.get(i).getName());
//read file
while((n = dis.read(buf)) != -1){
fos.write(buf,0,n);
fos.flush();
}
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这是发送文件的客户端代码
public void send(ArrayList<File>files){
try {
DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
System.out.println(files.size());
//write the number of files to the server
dos.writeInt(files.size());
dos.flush();
//write file names
for(int i = 0 ; i < files.size();i++){
dos.writeUTF(files.get(i).getName());
dos.flush();
}
//buffer for file writing, to declare inside or outside loop?
int n = 0;
byte[]buf = new byte[4092];
//outer loop, executes one for each file
for(int i =0; i < files.size(); i++){
System.out.println(files.get(i).getName());
//create new fileinputstream for each file
FileInputStream fis = new FileInputStream(files.get(i));
//write file to dos
while((n =fis.read(buf)) != -1){
dos.write(buf,0,n);
dos.flush();
}
//should i close the dataoutputstream here and make a new one each time?
}
//or is this good?
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
您正在读取套接字,直到read()
返回-1。这是流结束条件(EOS)。当对等端关闭连接时会发生EOS。当它写完一个文件时就不是了。
您需要在每个文件之前发送文件大小。您已经在对文件计数执行类似的操作了。然后确保为该文件读取的字节数准确:
String filename = dis.readUTF();
long fileSize = dis.readLong();
FileOutputStream fos = new FileOutputStream(filename);
while (fileSize > 0 && (n = dis.read(buf, 0, (int)Math.min(buf.length, fileSize))) != -1)
{
fos.write(buf,0,n);
fileSize -= n;
}
fos.close();
您可以将所有这些包含在一个循环中,该循环在ReadUTF()
抛出EOFException
时终止。相反,在发送数据之前,您必须在发送方调用writeutf(filename)
和writeLong(filesize)
。
问题内容: 我正在尝试在C中创建一个多线程服务器- 客户端文件传输系统。有些客户端将发送或列出或做其他选择(在交换机的情况下,您可以看到),而服务器则存储文件并提供大量服务客户。 就我所知,多线程意识形态确实很困难。它需要太多的经验而不是知识。我已经在该项目上工作了一个多星期,但我一直无法解决这些问题。 有4个选择:第一个是在其目录中列出客户端的本地文件,第二个是在客户端和服务器之间传输的列表文件
问题内容: 老派:我正在使用Java SE 5(或Javav1.5)(请不要告诉我进行升级,因为对于我正在从事的工作[私有],我需要使用此版本的Java )。 我需要设置Web客户端/服务器应用程序的帮助。我在网上寻找的每个变体都缩小了使用websockets /sockets的范围,但是我使用的Java版本还没有套接字。 有没有人有不使用套接字来设置客户端/服务器模型应用程序的教程,或者一些示例
问题内容: 当我使用套接字编程传输大文件时,收到的文件不完整,即它是一个mp3文件,当我播放时听起来很奇怪。代码是: 服务器端: 客户端: 在客户端,我只是为了简化而使用(我可以从服务器端发送文件的长度)。 如果客户端和服务器是同一台机器,则此代码可以完美地工作,但是如果它们位于不同的机器上,则文件会失真。 问题答案: 在Java中复制流的规范方法: 适用于大于零的任何缓冲区大小。应避免避免将缓冲
本文向大家介绍基于jsp的AJAX多文件上传的实例,包括了基于jsp的AJAX多文件上传的实例的使用技巧和注意事项,需要的朋友参考一下 最近的项目开发中,遇到了一个多文件上传的问题,即在不刷新页面的情况下,上传多个文件至服务器。现总结分享如下: 本文主要采用了基于jsp的ajax,jquery,servlet等技术。 1.upload.jsp 点击上传时,调用对应的fileupload函数,通过a
问题内容: 我意识到,由于UNIX套接字是特定于平台的,因此必须包含一些非Java代码。具体来说,我们对使用JDBC连接到仅启用UNIX域套接字的MySQL实例感兴趣。 看起来好像不支持该功能,但是据我所读, 如果 我们能够找到一个适合Java的UNIX套接字的实现, 那么 至少应该可以为基于UNIX套接字的JDBC写一个SocketFactory 。 有人尝试过吗?有人知道这样的实现吗? 问题答
本文向大家介绍基于WebUploader的文件上传js插件,包括了基于WebUploader的文件上传js插件的使用技巧和注意事项,需要的朋友参考一下 首先把地址甩出来,http://fex-team.github.io/webuploader/ 里面有比较完整的demo案例文档,本文主要是基于文件上传和图片上传增加了大量的注释,基本保证了每行代码都有注释以助于理解,是对官网demo的增强版,希