Java: многострочный вывод через Socket - PullRequest
0 голосов
/ 07 мая 2018

У меня возникли проблемы с моим кодом. Я должен отправить некоторые команды через клиент на сервер (создать файл или список файлов в каталоге), сервер должен создать файлы или отправить список существующих файлов обратно клиенту. Это сработало, но я думаю, что цикл while для вывода на стороне клиента никогда не останавливается, и клиент не может вводить новые команды. Я не понимаю проблему :(. Большое спасибо заранее.

Сервер:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Arrays;
import java.io.File;
import java.io.FileWriter;

public class MyServer {

    private final static String DIRECTORYLISTING = "directoryListing";
    private final static String ADDFILE = "addFile";
    private static String path = "/home/christoph/eclipse-workspace/Distributed Systems Ex 01/Work_Folder";

    private static PrintWriter pw = null;
    private static File file = null;

    private static String command1 = null; // Command
    private static String command2 = null; // File name
    private static String command3 = null; // File content

    private static ArrayList<File> files = new ArrayList<>(); //

    public static void splitClientInput(String clientInput) {
        try {
            String [] splittedInput = clientInput.split(";");

            command1=splittedInput[0];
            command2=splittedInput[1];
            command3=splittedInput[2];
        } catch(ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
    }

    public static void directoryListing() {
        try {
        File[] s = file.listFiles();
        for(int i = 0; i<s.length;i++) {
            pw.println(s[i].getName());
        }
        pw.flush();
        }catch(NullPointerException e) {
            e.printStackTrace();
        }
        }


    public static void addFile(String command2,String command3) throws IOException {
        file = new File(path +"/" +command2);
        if(file.isFile()) {
            pw.println("This Filename "+command2+" already exists.");
        } else {
            try {
                FileWriter fileWriter = new FileWriter(file);

                fileWriter.write(command3);
                files.add(file);
                pw.println(file.getName()+" created");

                if(command3.equals(null)) { 
                    pw.println("Your created file is empty");

                }
                fileWriter.close();
            }catch(IOException e) {
                pw.println("Error by creating file");

            }catch (NullPointerException e) {
                pw.println("Your created file is empty");

            }
        }
        }


    public static void checkInputCommand(String command1, String command2, String command3) throws IOException {
        switch(command1) {
            case DIRECTORYLISTING:
                directoryListing();
            break;
            case ADDFILE:
                addFile(command2, command3);
            break;
        }
    }

    public static void main(String[] args) {
        try {
            file = new File(path);
            files = new ArrayList<File>(Arrays.asList(file.listFiles()));

            ServerSocket ss = new ServerSocket(1118);
            System.out.println("Server Started...");
            Socket socket = ss.accept();

            OutputStream os = socket.getOutputStream();
            pw=new PrintWriter(os);

            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String clientInput = null;

            while((clientInput = br.readLine()) != null) {

                splitClientInput(clientInput);
                checkInputCommand(command1, command2, command3);
                pw.flush();
            }

            pw.flush();
            br.close();
            isr.close();
            is.close();
            pw.close();
            os.close();

            socket.close();
            ss.close();


        System.out.println("Server closed");

        }catch(BindException e) {
            e.printStackTrace();
        }catch(SocketException e) {
            e.printStackTrace();
        }catch(java.lang.NullPointerException e) {
            e.printStackTrace();
        }catch (IOException e) { 
            e.printStackTrace();
        } 
    }

}

Клиент:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class MyClient {
    public static void main(String[] args) throws Exception{
        try {
                Scanner sc = new Scanner(System.in);
                Socket s = new Socket("127.0.0.1", 1118);
                System.out.println("Client started");

                InputStream is = s.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);

                OutputStream os = s.getOutputStream();
                PrintWriter pw = new PrintWriter(os);

                String str= null;

                while(true){            
                    System.out.print("Client input: ");
                    pw.println(sc.nextLine());
                    pw.flush();

//                  System.out.println(br.readLine());

                    /*
                     * dont get out of the loop?
                     */
                    while((str=br.readLine())!=null) {
                        System.out.println(str);
                    }

                    br.close();
                    isr.close();
                    is.close();
                    s.close();

                }
            } catch(NullPointerException e) {
                e.printStackTrace();
            } catch(ConnectException e) {
                e.printStackTrace();
            }catch(UnknownHostException e) {
                    e.printStackTrace();
            }catch (IOException e) {
                    e.printStackTrace();
            } 
    }
}
...