import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; public class ChatClient extends Application { private Socket socket; private ObjectOutputStream out; private ObjectInputStream in; private TextArea messagesArea; private TextField messageField; private Button sendButton; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { messagesArea = new TextArea(); messagesArea.setEditable(false); messageField = new TextField(); sendButton = new Button("Send"); VBox root = new VBox(10, messagesArea, messageField, sendButton); root.setPadding(new Insets(10)); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.setTitle("Chat Client"); primaryStage.show(); connectToServer(); setupEventHandlers(); } private void connectToServer() { try { socket = new Socket("localhost", 9000); out = new ObjectOutputStream(socket.getOutputStream()); in = new ObjectInputStream(socket.getInputStream()); new Thread(() -> { while (true) { try { String message = (String)in.readObject(); messagesArea.appendText(message + "\n"); } catch (IOException | ClassNotFoundException e) { System.out.println("Error reading from server: " + e.getMessage()); break; } } }).start(); } catch (IOException e) { System.out.println("Error connecting to server: " + e.getMessage()); } } private void setupEventHandlers() { sendButton.setOnAction(event -> { String message = messageField.getText(); try { out.writeObject(message); messageField.clear(); } catch (IOException e) { System.out.println("Error sending message to server: " + e.getMessage()); } }); messageField.setOnAction(event -> sendButton.fire()); } }