尝试使用Java从客户端向服务器发送包含多个文件的目录

时间:2014-12-07 19:38:59

标签: java sockets client server

好的,我在FileClient,ClientConnection和FileServer下面有三个类,其中两个是主类,FileServer首先运行然后运行FileClient。我的多个文件的目录没有被转移到服务器。在我的FileClient类中,我怀疑bytesRead = is.read(mybytearray,0,mybytearray.length)没有读取文件字节,因此我的文件没有正确地传输到服务器。我该如何解决这个问题?

import java.io.*;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class FileClient {

    private static Socket sock;
    private static String fileName;
    private static BufferedReader stdin;
    private static PrintStream os;

    public static void main(String[] args) throws IOException {
        try {
            sock = new Socket("localhost", 54997);
            stdin = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            System.err.println("Cannot connect to the server, try again later.");
            System.exit(1);
        }

        os = new PrintStream(sock.getOutputStream());

        try {
              switch (Integer.parseInt(selectAction())) {
            case 1:
                os.println("1");
                sendFile();
                break;
            case 2:
                //receiveFile();
                break;
        }
        } catch (Exception e) {
            System.err.println("not valid input");
        }


        sock.close();
    }

    public static String selectAction() throws IOException {
        System.out.println("1. Send file.");
        System.out.println("2. Recieve file.");
        System.out.print("\nMake selection: ");

        return stdin.readLine();
    }

    public static void sendFile() {
        try {
            byte[] mybytearray = new byte[1024];
            InputStream is = sock.getInputStream();
            BufferedOutputStream bos = null;
            FileOutputStream fos = null;
            int bytesRead;
            String dirname ="FolderForServer";
            File dir = new File(dirname);
            dir.mkdirs();


            File[] listOfFiles = dir.listFiles();

            OutputStream os = sock.getOutputStream();

            //Sending file name and file size to the server
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF(dir.getName());

            dos.writeInt(listOfFiles.length);

            for(int j=0; j<listOfFiles.length; j++){

                dos.writeUTF(listOfFiles[j].getName());

                fos = new FileOutputStream(listOfFiles[j].getPath());

                bos = new BufferedOutputStream(fos);

                bytesRead = is.read(mybytearray, 0, mybytearray.length);
                System.out.printf("see\n");
                bos.write(mybytearray, 0, bytesRead);


            }
            bos.close();


        } catch (Exception e) {
            System.out.println("File does not exist!");
        }
    }

}  


import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CLIENTConnection implements Runnable {

    private Socket clientSocket;
    private BufferedReader in = null;

    public CLIENTConnection(Socket client) {
        this.clientSocket = client;
    }

    @Override
    public void run() {
        try {
            in = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));
            String clientSelection;
            while ((clientSelection = in.readLine()) != null) {
                switch (clientSelection) {
                    case "1":
                       receiveFile();
                        break;
                    case "2":
                        //sendFile();
                        break;
                    default:
                        System.out.println("Incorrect command received.");
                        break;
                }
                in.close();
                break;
            }

        } catch (IOException ex) {
            Logger.getLogger(CLIENTConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

  public void receiveFile() {
        try {
            int bytesRead;
            String fileName;
            OutputStream output = null;
            DataInputStream clientData = new DataInputStream(clientSocket.getInputStream());
            BufferedInputStream bis = null;
            OutputStream os;
            System.out.printf("see\n");
            String dirNowInServer = clientData.readUTF();
            File dir = new File(dirNowInServer);
            dir.mkdirs();
            System.out.printf("see\n");

            int number = clientData.readInt();

            for(int a=0; a<number; a++){
                String filename = clientData.readUTF();
                System.out.printf("see\n");
                File myfile = new File(dirNowInServer + "/" + filename);
                while (true) {
                 // Socket sock = servsock.accept();
                  byte[] mybytearray = new byte[(int) myfile.length()];
                  bis = new BufferedInputStream(new FileInputStream(myfile));
                  bis.read(mybytearray, 0, mybytearray.length);
                   os = clientSocket.getOutputStream();
                  os.write(mybytearray, 0, mybytearray.length);
                  os.flush();
                  clientSocket.close();
                }
            }
            bis.close();

        } catch (IOException ex) {
            System.err.println("Client error. Connection closed.");
        }
    } 


}


import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {

    private static ServerSocket serverSocket;
    private static Socket clientSocket = null;

    public static void main(String[] args) throws IOException {

        try {
            serverSocket = new ServerSocket(54997);
            System.out.println("Server started.");
        } catch (Exception e) {
            System.err.println("Port already in use.");
            System.exit(1);
        }

        while (true) {
            try {
                clientSocket = serverSocket.accept();
                System.out.println("Accepted connection : " + clientSocket);

                Thread t = new Thread(new CLIENTConnection(clientSocket));

                t.start();

            } catch (Exception e) {
                System.err.println("Error in connection attempt.");
            }
        }
    }
}

0 个答案:

没有答案