基于socket的Java多文件传输
好的,尝试通过套接字传输指定的文件目录,从arraylist中删除目录对象,这样只剩下文件,然后通过同一套接字逐个传输它们。这里的arraylist只填充了文件,没有目录。这是客户端和服务器的接收和发送代码。除了所有数据都写入第一个文件之外,代码运行正常,没有错误。后续文件在服务器文件夹中创建,但它们是0字节。如有任何意见,将不胜感激 这是用于接收文件的服务器代码基于socket的Java多文件传输,java,Java,好的,尝试通过套接字传输指定的文件目录,从arraylist中删除目录对象,这样只剩下文件,然后通过同一套接字逐个传输它们。这里的arraylist只填充了文件,没有目录。这是客户端和服务器的接收和发送代码。除了所有数据都写入第一个文件之外,代码运行正常,没有错误。后续文件在服务器文件夹中创建,但它们是0字节。如有任何意见,将不胜感激 这是用于接收文件的服务器代码 public void receive(){ try { DataInputStream dis = n
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();
}
}
public void receive(){
试一试{
DataInputStream dis=新的DataInputStream(新的BufferedInputStream(socket.getInputStream());
DataOutputStream dos=新的DataOutputStream(新的BufferedOutputStream(socket.getOutputStream());
//从客户端读取文件数
int number=dis.readInt();
ArrayList文件=新的ArrayList(编号);
System.out.println(“要接收的文件数:“+Number”);
//读取文件名,将文件添加到arraylist
for(int i=0;i
这是用于发送文件的客户端代码
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();
}
}
public void发送(ArrayListfiles){
试一试{
DataInputStream dis=新的DataInputStream(新的BufferedInputStream(socket.getInputStream());
DataOutputStream dos=新的DataOutputStream(新的BufferedOutputStream(socket.getOutputStream());
System.out.println(files.size());
//将文件数写入服务器
dos.writeInt(files.size());
dos.flush();
//写文件名
对于(int i=0;i
您正在读取套接字,直到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()
抛出EOFEException
时终止。相反,在发送数据之前,您必须在发送方调用writeUTF(filename)
和writeLong(filesize)
。您正在读取套接字,直到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()
抛出EOFEException
时终止。相反,在发送数据之前,您必须在发送方调用writeUTF(文件名)
和writeLong(文件大小)
。我这样做的,它工作得很好,您可以看一下:
发送
byte[] done = new byte[3];
String str = "done"; //randomly anything
done = str.getBytes();
for (int i = 0; i < files.size(); i++) {
System.out.println(files.get(i).getName());
FileInputStream fis = new FileInputStream(files.get(i));
while ((n = fis.read(buf)) != -1) {
dos.write(buf, 0, n);
System.out.println(n);
dos.flush();
}
//should i close the dataoutputstream here and make a new one each time?
dos.write(done, 0, 3);
dos.flush();
}
//or is this good?
dos.close();
byte[]done=新字节[3];
String str=“完成”//随便什么
done=str.getBytes();
对于(int i=0;i
接收
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
fos = new FileOutputStream("C:\\users\\tom5\\desktop\\salestools\\" + files.get(i).getName());
//read file
while ((n = dis.read(buf)) != -1 && n != 3) {
fos.write(buf, 0, n);
fos.flush();
}
fos.close();
}
for(int i=0;i
我是这样做的,它工作得很好,您可以看看:
发送
byte[] done = new byte[3];
String str = "done"; //randomly anything
done = str.getBytes();
for (int i = 0; i < files.size(); i++) {
System.out.println(files.get(i).getName());
FileInputStream fis = new FileInputStream(files.get(i));
while ((n = fis.read(buf)) != -1) {
dos.write(buf, 0, n);
System.out.println(n);
dos.flush();
}
//should i close the dataoutputstream here and make a new one each time?
dos.write(done, 0, 3);
dos.flush();
}
//or is this good?
dos.close();
byte[]done=新字节[3];
String str=“完成”//随便什么
done=str.getB