@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());
        }
    }
}
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
Vamp
@Vamp
Нужно тело try блока, где открывается серверный сокет, обернуть в бесконечный цикл. Чтобы сервер не завершался после обработки первого клиента.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы