I'm trying to build some Chatting Application with Javafx and java.net networking package. I want the text the User typed in the textfield to be send from the client to the server and from there back to the client and eventually showing up in the textarea of the application. But the application is crashing after I press Enter when I typed in a text in the TextField. So in the "handle"-method of the EventHandler there must be the error. Also the application is crashing before the input-text gets cleared. The application is not responding --> error window pops up.Application is not responding
Client-side Code:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.Parent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.*;
public class ChatAppClient extends Application {
private TextArea messages = new TextArea();
private TextField input;
private static String ipAdress = null;
private DataInputStream dis;
private DataOutputStream dos;
private static Socket client;
public Parent mainScene() throws UnknownHostException, IOException {
// Getting IP-Adress from a different file as a String
String userDir = System.getProperty("user.dir");
File file = new File(userDir + "\\..\\IPAdress.txt");
RandomAccessFile raFile = new RandomAccessFile(file, "rw");
raFile.seek(0);
ipAdress = raFile.readLine();
raFile.close();
// Initialising new Socket
client = new Socket(ipAdress, 5000);
System.out.println("Connected to Server.");
// Defining JavaFx Application-Layout
messages.setPrefHeight(220);
input = new TextField();
VBox root = new VBox(20, messages, input);
root.setPrefSize(400, 400);
// Setting up action for Textfield when pressing Enter
input.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
try {
// Defining and initialising Input-String
String message = "Client: ";
message += input.getText();
// Opening OutputStream for String to send it to the server
dos = new DataOutputStream(client.getOutputStream());
// Giving the String to the OutputStream
dos.writeBytes(message);
// Clearing the Textfield from Input-Text
input.clear();
// Setting up InputStream for the Socket to receive the String back from the
// server
dis = new DataInputStream(client.getInputStream());
// Reading String from InputStream
String s = dis.readLine();
// Closing In-and OutputStreams + Socket
dos.close();
// Showing the String in the TextArea "messages"
messages.appendText(s + "\n");
} catch (IOException ioE) {
ioE.printStackTrace();
}
}
});
return root;
}
public void start(Stage mainStage) {
try {
mainStage.setScene(new Scene(mainScene()));
mainStage.show();
} catch (UnknownHostException uHE) {
uHE.printStackTrace();
} catch (IOException iOE) {
iOE.printStackTrace();
}
}
public static void main(String[] args) {
try {
launch(args);
client.close();
} catch (IOException ioE) {
ioE.printStackTrace();
}
}
}
Server-side Code:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatAppServer {
public static void main(String[] args) {
try {
// Defining/ Initialising new ServerSocket
ServerSocket caServerSocket = new ServerSocket(5000);
System.out.println("Waiting for Client...");
Socket nSocket = caServerSocket.accept();
System.out.println("Client connected.");
// Setting up InputStream for the ServerSocket to receive the message String
DataInputStream clientMessages = new DataInputStream(nSocket.getInputStream());
String s = clientMessages.readLine();
// Testing if the Input String got received
System.out.println(s);
// Setting up OutputStream to send back the String
DataOutputStream clientMessagesBack = new DataOutputStream(nSocket.getOutputStream());
clientMessagesBack.writeBytes(s);
caServerSocket.close();
} catch (IOException ioE) {
ioE.printStackTrace();
}
}
}