Проблема в приложении Сервер-Клиент в JavaFX - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь создать сеть между одним клиентом и сервером на локальном хосте, используя 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 кнопки в конструкторе сцен каждого из классов.

Любые предложения являются заметными. Спасибо ...

...