我正在尝试使用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);
}