タイトルについて申し訳ありません。私はそれをどう呼ぶべきかを見つけるのに苦労しました。
だからここに契約があります!私は現在、JavaFx で作成した Gui を使用するチャット アプリケーションを作成しています (Gui にはいくつかのグラフィックが含まれていますが、それはあまり関係ないと思います)。各クライアントがプログラムを介して接続するサーバー! 主なアイデアは、クライアントがサーバーにメッセージを送信し、サーバーがそれを他のクライアントに送信することです (これがチャット プログラムの全体的なアイデアです)。まだ!
したがって、実際の問題に取り掛かるには:
接続、受信、送信のメソッドを含むクライアント クラスを作成しました。私のConnectクラスはGuiで正常に動作し、問題なくサーバーに接続できます!
サーバーとの間で送受信しようとすると、問題が発生します。どれだけ多くの例外をスローしても、何回 Catch を試行しても、nullpointer エラーが発生します。問題を理解しようとして約2時間コードを調べましたが、運がありませんでした! 私のコードは次のとおりです。
クライアントクラス:
private PrintWriter pw;
/**
* @param args
* @throws IOException
*/
public void connect() throws IOException{
final int portNumber = 6040;
// du kan vælge at bruge inetadressen til at connecte i socketet.
InetAddress adr = InetAddress.getByName("localhost");
Socket socket = new Socket("localhost", portNumber);
pw = new PrintWriter(socket.getOutputStream());
// outPut - Programmet sender til serveren
pw.println("Connected waiting for input");
pw.flush();
//input - Serveren sender til programmet;
}
public void Send(String x) throws IOException{
if (x != null) {
pw.print(x);
pw.flush();
}else {
System.out.println("ingen meddelse");
}
}
public String getInformation(){
Scanner informationFromServer = new Scanner(System.in);
String x = informationFromServer.nextLine();
if (x== null) {
return "";
}
return x;
}
私の simpleController コード (私の GUI を制御するコード):
public class SimpleController implements Initializable{
public Button btn_Connect;
private Client client;
public Label chatPerson3;
public Label chatPerson1;
public Label lbl_Chatperson1_userName;
public TextField txt_userName;
public TextField textField_chat;
public TextField txt_ChatPerson1;
public Button Send;
public TextField txt_ChatPerson2;
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
btn_Connect.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
chatPerson1.setVisible(true);
lbl_Chatperson1_userName.setText(txt_userName.getText());
}
});
Send.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
String x = textField_chat.getText();
textField_chat.setText("");
txt_ChatPerson1.setVisible(true);
txt_ChatPerson1.setText(x);
System.out.println(x);
try {
client.Send(x);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}}
そして最後になりましたが、私のメイン:
public class Main extends Application{
public static void main(String[] args) throws IOException{
Application.launch(Main.class, (java.lang.String[]) null);
}
@Override
public void start(Stage primaryStage) throws Exception {
try {
Client c = new Client();
c.connect();
AnchorPane page = (AnchorPane) FXMLLoader.load(Main.class.getResource("testingBackground.fxml"));
Scene scene = new Scene(page);
primaryStage.setScene(scene);
primaryStage.setTitle("Chatten");
primaryStage.show();
} catch (Exception ex) {
java.util.logging.Logger.getLogger(Main.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
}
}
}
送信しようとしたときに発生する例外はもちろん client.send() メソッドにあり、送信する前に受信しようとすると client.getInformation() メソッドにあります。
私は何を間違えましたか?私は何が欠けていますか?