如何实现客户端服务器通信

时间:2019-12-14 21:34:32

标签: java multithreading client-server

我必须开发一个多线程服务器-客户端应用程序,该应用程序的工作方式类似于Google驱动器。因此,用户首先需要创建一个帐户,然后登录,并具有诸如将文件上传到服务器,预览文件,与其他用户共享他的文件等选项。我有两个问题: 1)首先,如何告诉服务器应该执行哪些操作以及获得什么输入。我想出了一个使用流(甚至可能在另一个端口上)的想法,该想法仅用于客户端告诉服务器该做什么,下一步是哪个输入,以及服务器将答案返回给客户端,但是没有人有更好的主意吗? ?我不知道是否可以对每个操作使用不同的端口,例如在一个端口上登录,在另一个端口上注册等等,我想那是最好的选择,但是我不知道这是否是正确的想法。

2)其次,我尝试了登录选项的想法,如果我随后立即运行服务器和客户端,则可以正常工作,但是如果我等一分钟后再运行客户端,则客户端的线程卡住了。我不知道出了什么问题,请帮忙!

public static void main(String[] args) {
        try(ServerSocket serverSocket = new ServerSocket(5000);
                BufferedReader br = new BufferedReader(new FileReader("Resources\\Users"))){
            String line;
            String username = "";
            String password = "";
            while((line = br.readLine()) != null) {
                if(username.isEmpty()) {
                    username = line;
                    continue;
                }
                password = line;
                System.out.println(username);
                System.out.println(password);
                users.put(username, password);
            }

            while(true) {
                Socket socket = serverSocket.accept();

                ServerThread thread = new ServerThread(socket);

                thread.start();

            }
        }catch(IOException e) {
            System.out.println(e.getMessage());
        }
    }

这是我的服务器课程,不要介意我使用txt文件存储信息,这是我考试的低级应用程序,并且我没有足够的时间来实现数据库。

public static void main(String[] args) {

        login = new LogInPage();

        try {

            socket = new Socket("localhost", 5000);
            input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            output = new PrintStream(socket.getOutputStream());
            keyboardInput = new BufferedReader(new InputStreamReader(System.in));
            actionInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            actionOutput = new PrintStream(socket.getOutputStream());
            while(true) {
                if(guiMessage.equals("login")) {
                    login(input, output, actionInput, actionOutput);
                    System.out.println(login.getClientMessage());
                    break;
                }else {
                    login.setClientMessage("");
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

这是我的客户端类,我使用一个空字符串告诉服务器,而我的GUI不需要执行任何操作。 我只实现了我的登录选项解决方案。

0 个答案:

没有答案