Несколько клиент-сервер Java Программирование с GUI - PullRequest
0 голосов
/ 23 марта 2020

Я отчаянно пытался заставить этот сервер принимать несколько клиентов.

В настоящее время сервер представляет собой GUI, который может одновременно обмениваться файлами и обмениваться файлами с клиентом (который также может делать то же самое с помощью аналогичной установки GUI). На данный момент я создал отдельный класс ClientHandler, который создает новый сервер с помощью многопоточности для каждого запроса подключения клиента. Кроме того, на данный момент первый подключенный клиент успешно считывает потоки и подключается, а дополнительные клиенты подключаются к хосту, но никогда не получают потоки (или, по-видимому, таким образом, по крайней мере, при печати во вновь созданном клиенте). windows).

Не публикуя все 500 строк кода, я опубликую методы конструктора run () и processConnection () из серверного приложения (то есть созданного потока)

    public TextingServerJF(Socket socket, ObjectInputStream input, ObjectOutputStream output) {


    this.connection = socket;
    this.input = input;
    this.output = output;

    setupGUI();

} // end TextingServerJF constructor

    @Override
    public void run() {

    //try {
        //server = new ServerSocket(10007, 100);

        while (true) {
            try {
                //waitForConnection();
                //getStreams();                 
                processConnection();

            } catch (EOFException eofException) {
                displayMessage("\nServer terminated connection");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeConnection();
                ++counter;
            } // end inner try block
        } // end while
        /*
    } catch (IOException ioException) {
        ioException.printStackTrace();
    } // end outer try block
    */
} // end runServer()
    private void processConnection() throws IOException {
    String message = "Connection successful";
    sendData(message);
    setTextFieldEditable(true);

    do {
        try 
        {               
            /*
             * Code to enter the "receive file mode" if the client sends a file
             */
            if (message.equals("CLIENT>>> data sent")) {
                receiveFile();
            } // end if

            message = (String) input.readObject();

            displayMessage("\n" + message);

            /*
             * Code for step 1 of the lab -- Code looks for a
             * "Message received successfully" from the client and if it gets one, it does
             * nothing. Otherwise the message is sent from the server that IT received the
             * message successfully. Essentially the server is echoing that it received the
             * message if the client sends one.
             */

            if (message.equals("CLIENT>>> Message received successfully")) {
                // Do nothing to avoid an infinite loop for step 1
                // Below is for step 2
                displayTime(getTime(System.nanoTime()));
                setTimeAverage(rtt);
                timeCount++;
                time = 0;
                if (timeCount > 10) {
                    displayAverage(getTimeAverage(timeAverage, timeCount), timeCount);
                    // end step 2
                } // end inner if
            } else {
                sendData("Message received successfully");
            } // end if/else

        } // end try block
        catch (ClassNotFoundException classNotFoundException) {
            displayMessage("\nUnknown object type received");
        }
    } while (!message.equals("CLIENT>>> TERMINATE")); // end do-while
} // end method processConnection

Обратите внимание, что сервер реализует работоспособный. Клиентский обработчик имеет свой собственный gui, который просто говорит, что ждет клиента, а затем исчезает при подключении, как вы увидите ниже. Любая помощь с благодарностью! Теперь ниже я опубликую свой код обработчика клиента:

   public void run() {
        try {
            server = new ServerSocket(1007, 100);
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        while (true) {
            socket = null;
            try {

                socket = server.accept();
                getStreams();
                frame.setVisible(false);
                frame.dispose();

                TextingServerJF serverApp = new TextingServerJF(socket, input, output);

                clientThread = new Thread(serverApp);
                array.add(serverApp);
                counter++;

                clientThread.start();

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeConnection();                          
            }// end try block   
        } // end while

} // end method run
   private void getStreams() throws IOException {
    output = new ObjectOutputStream(socket.getOutputStream());
    output.flush();

    input = new ObjectInputStream(socket.getInputStream());

} // end method getStreams

private void closeConnection() {

    try {
        output.close();
        input.close();
        socket.close();
    } catch (IOException ioException) {
        ioException.printStackTrace();
    } // end try block
} // end method closeConnection
...