Я разрабатываю клиент-серверное приложение на Java, где клиент отправляет сообщение на сервер, и сервер должен его обработать и вернуть ответ (реализация простого эхо-сервера). Проблема заключается в том, что хотя соединение между клиентом и сервером устанавливается успешно, сообщения отправленные клиентом, не доходят до сервера и не отображаются в текстовой метке. Какие могут быть причины, по которым сервер не получает сообщения от клиента, несмотря на наличие активного соединения, и как можно устранить эту проблему?
Сервер
‘’’ package Server;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
public class Server {
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(8081)){
while(true) {
Socket socket = serverSocket.accept();
System.out.println(“New Client!”);
new Thread(() → new ClientHandler(socket)).start();
}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
class ClientHandler implements Runnable{
private final Socket socket;
ClientHandler(Socket socket){
this.socket = socket;
}
@Override
public void run(){
try(DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream())){
while(true) {
String response = in.readUTF();
System.out.println("Client response- " + response);
out.writeUTF(response);
}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}‘’’
Клиент
‘’'package Server;
import javax.swing.;
import javax.swing.border.LineBorder;
import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
class Client2 extends JFrame{
private JLabel responseLabel;
private JTextField textField;
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private Client2(){
super("Client");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null); // Используем абсолютное позиционирование
// Размеры окна
int width = 400;
int height = 200;
// Ширина и высота компонентов
int labelWidth = 350;
int labelHeight = 30;
int textFieldWidth = 150;
int textFieldHeight = 30;
int buttonWidth = 120;
int buttonHeight = 30;
// Позиции компонентов
int labelX = (width - labelWidth) / 2;
int labelY = 20;
int textFieldX = (width - textFieldWidth) / 2;
int textFieldY = labelY + labelHeight + 10;
int buttonX = (width - buttonWidth) / 2;
int buttonY = textFieldY + textFieldHeight + 10;
// Инициализация и установка Bounds
//метка
responseLabel = new JLabel();
responseLabel.setBorder(new LineBorder(Color.BLACK, 2));
responseLabel.setBounds(labelX, labelY, labelWidth, labelHeight);
//текстовое поле
textField = new JTextField();
textField.setBounds(textFieldX, textFieldY, textFieldWidth, textFieldHeight);
//кнопка
JButton button = new JButton("Send message");
button.setFocusPainted(false);
button.setBounds(buttonX, buttonY, buttonWidth, buttonHeight);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread(() -> {
String message = textField.getText();
String response = sendMessage(message);
responseLabel.setText(response);
}).start();
}
});
// Добавление компонентов
add(responseLabel);
add(textField);
add(button);
// Настройка окна
setSize(width, height);
setVisible(true);
try{
socket = new Socket("localhost", 8081);
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
}
catch(Exception e){
System.out.println("Connect dead");
}
}
private String sendMessage(String message) {
String response = "";
try{
out.writeUTF(message);
out.flush(); // Убедимся, что данные отправлены
response = in.readUTF();
} catch (Exception e) {
response = "Error- " + e.getMessage();
}
return response;
}
public static void main(String[] args){
// Запуск GUI
new Client2();
}
} ‘’’