Добрый вечер!
Имеется программа с одной формой (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());
}
}
}