@Decaf

Java. Сокеты. Как заставить сервер постоянно слушать до нажатия кнопки?

Добрый вечер!

Имеется программа с одной формой (Swing), которая представляет графический интерфейс двух идентичных приложений. То есть два раза запуская класс с графическим интерфейсом, получаются 2 приложения, которые имеют кнопку Прослушать (Toggle Button) - listen и Отправить (обычная кнопка) - send, а также 2 текстовых поля: 1) просто текст - textForFile, 2) текст в виде байтов - textInBytes.

При вводе текста в текстовое поле, он записывается в виде байтов в другое текстовое поле. По нажатию на кнопку Отправить, сообщение приходит в другое приложение (с идентичным графическим интерфейсом), где уже зажата кнопка Прослушать и записывается в виде байтов и текста в соответствующие текстовые поля.

Всё работает, но сервер слушает только один раз, как реализовать чтобы сервер слушал постоянно, и когда сообщение приходит - сразу заполнял текстовые поля, а при нажатии на кнопку listen в не зажатом состоянии ресурсы освобождались?
Пробовал и с бесконечным while и с потоками, но безуспешно.

Обработчик нажатия по кнопке Прослушать:
private void listenActionPerformed(java.awt.event.ActionEvent evt) {                                       
    // Если нажата кнопка Прослушать:
    if (listen.isSelected()) {
        Server.main(); // запуск сервера
    } else {
    }
}


Обработчик нажатия по кнопке Отправить:
private void sendActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // Запись текста в байтах в текстовое поле:
    textInBytes.setText(Arrays.toString(textForFile.getText().getBytes()));
        
    Client.main(); // запуск клиента
}


Server:
import static application.UserInterface.textForFile;
import static application.UserInterface.textInBytes;
import java.io.*;
import java.net.*;
import java.util.Arrays;
 
public class Server {
    private static final int port = 6666; // порт сервера
    
    public static void main() {
        InetAddress ia = null;
        
        try {
            ia = InetAddress.getByName("localhost");
        } catch (UnknownHostException e) {
            System.out.println("Server not found: " + e.getMessage());
        }
        
        try (ServerSocket serverSocket = new ServerSocket(port, 0, ia)) {
                Socket socket = serverSocket.accept();
                try (DataInputStream dIn = new DataInputStream(socket.getInputStream())) {
                    byte[] bytes = null;
                    int length = dIn.readInt();
                    if (length > 0) {
                        bytes = new byte[length];
                        dIn.readFully(bytes, 0, bytes.length);
                        
                        textInBytes.setText(Arrays.toString(bytes));
                        textForFile.setText(new String(bytes));
                    }
                }
        } catch (IOException e) {
            System.out.println("I/O error: " + e.getMessage());
        }
    }
}


Client:
import static application.UserInterface.textForFile;
import java.io.*;
import java.net.*;
 
public class Client {
    private static final int serverPort = 6666;
    private static final String localhost = "127.0.0.1";
    
    public static void main() {
        InetAddress ipAddress = null;
        DataOutputStream dOut = null;
        
        try {
            ipAddress = InetAddress.getByName(localhost);
        } catch (UnknownHostException e) {
            System.out.println("Server not found: " + e.getMessage());
        }
        
        try (Socket socket = new Socket(ipAddress, serverPort)) {
            byte[] bytes = textForFile.getText().getBytes();
            if (dOut == null) {
                dOut = new DataOutputStream(socket.getOutputStream());
            }
            dOut.writeInt(bytes.length);
            dOut.write(bytes);
        } catch (UnknownHostException e) {
            System.out.println("Server not found: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("I/O error: " + e.getMessage());
        }
    }
}
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
Vamp
@Vamp
Нужно тело try блока, где открывается серверный сокет, обернуть в бесконечный цикл. Чтобы сервер не завершался после обработки первого клиента.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
28 мар. 2024, в 18:16
1000 руб./за проект
28 мар. 2024, в 18:15
90000 руб./за проект
28 мар. 2024, в 18:05
5000 руб./за проект