Почему происходит сбой приложения javafx при одновременном использовании EventHandler и сокета java. net? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь создать приложение для чата с сетевым пакетом Javafx и java. net. Я хочу, чтобы текст, введенный пользователем в текстовое поле, отправлялся с клиента на сервер, а оттуда обратно на клиент и в конечном итоге отображался в текстовой области приложения. Но приложение падает после того, как я нажимаю Enter, когда я набираю текст в TextField. Таким образом, в методе «дескриптор» EventHandler должна быть ошибка. Также происходит сбой приложения до того, как введенный текст будет очищен. Приложение не отвечает -> появляется окно ошибки. Приложение не отвечает

Код на стороне клиента:

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();
  }
  }

  }

Код на стороне сервера:

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();
    }
}
}
...