Я пытаюсь создать сеть между одним клиентом и сервером на локальном хосте, используя javafx. У меня проблема в том, что консоль возвращает java .lang.NullPointerException. Я хотел, чтобы сообщение из textField одного было добавлено к textField другого после нажатия кнопки. Но этого не происходит. Я новичок в javafx и такое программирование сокетов. Я просмотрел веб-статьи и думаю, что моя проблема в объявлении переменных в классе контроллера. Но я понятия не имею, оправиться от этого. Кстати, сервер и клиент находятся в разных проектах. Понятия не имею.
Контроллер. java клиента:
package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import java.awt.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
public class Controller {
@FXML
private static TextField client_text_field;
@FXML
private static TextArea client_text_area = new TextArea();
static Socket s;
static DataInputStream dis;
static DataOutputStream dos;
public static void main(String[] args){
try{
s = new Socket("localhost",8888);
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
String s2="";
while(true){
s2 = dis.readUTF();
if(s2.equals("bye")) break;
client_text_area.setText(client_text_area.getText().trim() + "\n" + "Server: " + s2);
}
dos.close();
s.close();
}catch(Exception e){
System.out.println(e);
}
}
public void send(ActionEvent event){
try{
String s1 = client_text_field.getText().trim();
dos.writeUTF(s1);
dos.flush();
client_text_field.clear();
}catch(Exception e){
System.out.println(e);
}
}
}
Контроллер. java сервера:
package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Controller {
@FXML
private static TextField server_text_field;
@FXML
private static TextArea server_text_area = new TextArea();
static ServerSocket ss;
static Socket s;
static DataOutputStream dos;
static DataInputStream dis;
public static void main(String[] args){
try{
ss = new ServerSocket(8888);
s = ss.accept();
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
String s2 = "";
while(true){
s2 = dis.readUTF();
if(s2.equals("bye")) break;
server_text_area.setText(server_text_area.getText().trim() + "\n" + s2);
}
dis.close();
s.close();
ss.close();
}catch(Exception e){
System.out.println(e);
}
}
public void act(ActionEvent event){
try{
String s1 = server_text_field.getText().trim();
dos.writeUTF(s1);
dos.flush();
server_text_field.clear();
}catch(Exception p){
System.out.println(p);
}
}
}
f xml файл сервера:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="sample.Controller">
<children>
<AnchorPane prefHeight="583.0" prefWidth="630.0">
<children>
<Label layoutX="262.0" layoutY="14.0" prefHeight="27.0" prefWidth="54.0" text="SERVER" />
<TextArea fx:id="server_text_area" layoutX="4.0" layoutY="41.0" prefHeight="458.0" prefWidth="619.0" />
<TextField fx:id="server_text_field" layoutX="4.0" layoutY="521.0" prefHeight="50.0" prefWidth="552.0" />
<Button layoutX="565.0" layoutY="534.0" mnemonicParsing="false" onAction="#act" text="SEND" textFill="#1e1a97" />
</children>
</AnchorPane>
</children>
<columnConstraints>
<ColumnConstraints />
</columnConstraints>
<rowConstraints>
<RowConstraints />
</rowConstraints>
</GridPane>
f xml файл клиента:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="sample.Controller">
<children>
<AnchorPane prefHeight="538.0" prefWidth="622.0">
<children>
<TextArea fx:id="client_text_area" layoutX="10.0" layoutY="39.0" prefHeight="397.0" prefWidth="603.0" />
<TextField fx:id="client_text_field" layoutX="14.0" layoutY="452.0" prefHeight="74.0" prefWidth="517.0" />
<Button layoutX="549.0" layoutY="477.0" mnemonicParsing="false" onAction="#send" text="Send" textFill="#2c2084" />
<Label layoutX="260.0" layoutY="14.0" prefHeight="18.0" prefWidth="50.0" text="CLIENT" textAlignment="CENTER">
<opaqueInsets>
<Insets bottom="5.0" left="10.0" right="10.0" />
</opaqueInsets>
</Label>
</children>
</AnchorPane>
</children>
<columnConstraints>
<ColumnConstraints />
</columnConstraints>
<rowConstraints>
<RowConstraints />
</rowConstraints>
</GridPane>
Функция действия была установлена в поле onAction кнопки в конструкторе сцен каждого из классов.
Любые предложения являются заметными. Спасибо ...