Javafx服务器和客户端,等待响应

时间:2019-11-24 01:23:27

标签: java multithreading javafx server

我正在尝试使用Javafx创建基本的服务器和客户端应用程序。当应用程序启动时,将启动一个单独的线程,该线程连接到服务器并等待响应。服务器将根据您发送的内容输出响应。主线程使用文本字段来提供用户输入,并将该用户输入添加到在主线程(自身)和创建的线程(等待服务器响应)之间共享的聊天日志区域。

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.Label;
import javafx.scene.Scene;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.InputMismatchException;
import java.net.Socket;

public class ChatClient extends Application {

    static String userName;
    static int portNumber;
    static Socket server;
    static PrintWriter out;
    static BufferedReader in;
    static BufferedReader stdIn;
    static Controller controller = new Controller();
    static TextField userInputField;
    static TextArea chatTranscript;



    public static void main(String[] args) throws Exception {

        userName = "userName45";
        portNumber = 4688;


        class chatReader extends Thread {
            public void run() {
                try {
                    server = new Socket("localhost", portNumber);
                    out = new PrintWriter(server.getOutputStream(), true);
                    in = new BufferedReader(new InputStreamReader(server.getInputStream()));
                } catch (Exception x) {
                    System.out.println(x + " setup exception");

                }

                try {
                    String serverOutput;
                    while (true) {
                        serverOutput = in.readLine();
                        controller.serverResponse(serverOutput, chatTranscript);
                        System.out.println(serverOutput);
                    }
                } catch (Exception x) {
                    System.out.println(x + " output exception");

                }
            }
        }

        chatReader serverResponse = new chatReader();
        serverResponse.start();

        launch(args);
    }

    @Override
    public void start (Stage primaryStage){

        BorderPane root = new BorderPane();

        //Set left side for user input.
        Label leftTitle = new Label("Chat Input");
        userInputField = new TextField();
        VBox left = new VBox(5);
        left.getChildren().addAll(leftTitle, userInputField);
        root.setLeft(left);
        userInputField.setOnAction(event -> controller.userInput(out, userInputField.getText(), chatTranscript));

        //Set right side for chat log
        Label rightTitle = new Label("Chat Log");
        chatTranscript = new TextArea();
        chatTranscript.setEditable(false);
        chatTranscript.setWrapText(true);
        VBox right = new VBox(5);
        right.getChildren().addAll(rightTitle, chatTranscript);
        root.setRight(right);


        primaryStage.setTitle("Chat Client Application");
        primaryStage.setScene(new Scene(root, 600, 600));
        primaryStage.show();
    }
    }

我一直在获取“空指针异常输出异常”,这是我的线程的run()方法所在的位置,但是我无法对其进行修复。您如何正确等待响应,我尝试使用in.readline()来解决问题。我知道服务器可以正常工作并做出响应,因为我可以使其与其他客户端一起工作。它只是回显您发送的内容,因此发送 HELLO,得到 HELLO,从服务器返回。

这也是我在输入内容并获得回复后添加到聊天区域的方法。 注意:Userinput调用另一个方法,因为主线程负责添加用户输入的内容。

public void userInput(PrintWriter out, String textOut, TextArea chat) {
    serverResponse(textOut,chat);
    System.out.println("This is what I am sending to the server: " + textOut);
    out.println(textOut);
}

public synchronized void serverResponse(String serverOutput, TextArea chat) {
    chat.setText(chat.getText() + serverOutput);

}

0 个答案:

没有答案