Java 连接到服务器时的 BufferedWriter - 空指针异常 - 聊天应用

Java BufferedWriter when connected to server - null pointer exception - chat app

这是一个简单的聊天应用程序。服务器和客户端作为单独的应用程序。 服务器和客户端之间的连接工作正常。当我尝试通过 BufferedWriter 将 String 从客户端发送到服务器 BufferedReader 时出现问题。我有空指针异常。
你能告诉我这个应用程序中的线程逻辑一切正常吗?

服务器应用程序

public class Server {
private int                 port    =   5000;
private ServerSocket        server  =   null;
private Socket              socket  =   null;
private InputStreamReader   isr     =   null;
private OutputStreamWriter  osw     =   null;
private BufferedReader      br      =   null;
private BufferedWriter      bw      =   null;
private Chat                chat;
private String              message;

private int                 bOffset =   10;
private JFrame              mainFrame;
private JPanel              mainPanel;
private JPanel              boxPanel;
private JLabel              boxTitleLabel;
private JTextArea           incomingMessagesJTextArea;
private JTextField          messageWritten;
private JButton             sendServerButton;

public static void main(String[] args){

    System.out.println("Server is running");
    new Server().createGUI();     //some swing GUI things
    new Server().createServerConnection();

}

public void createServerConnection(){

    try {

        /** Create socket for communication between apps */
        server = new ServerSocket(port);
        socket = server.accept();
        System.out.println("Server accept client: OK");

        /** Create output writers */
        osw = new OutputStreamWriter(socket.getOutputStream());
        bw = new BufferedWriter(osw);

        /** Create inputs readers */
        isr = new InputStreamReader(socket.getInputStream());   //data in bytes format
        br = new BufferedReader(isr);                           //data in character format

    } catch (IOException e) {
        System.out.println("Server Error createServerConnection(): " +e.getMessage());
    }

    /** Create new thread for read server-input data */
    new Thread(new Runnable() {
        public void run() {
            System.out.println("Server Thread - running");

            while (true) {

                try {
                        String message = br.readLine();
                        System.out.println(message);

                } catch (IOException e) {
                    System.out.println("Server Error createServerConnection() -> new Thread: " +e.getMessage());
                }
            }
        }
    }
    ).start();

}}

客户端应用程序

public class Client {
private int                 port    =   5000;
private Socket              socket  =   null;
private InputStreamReader   isr     =   null;
private OutputStreamWriter  osw     =   null;
private BufferedReader      br      =   null;
private BufferedWriter      bw      =   null;
private String              message;

private int                 bOffset =   10;
private JFrame              mainFrame;
private JPanel              mainPanel;
private JPanel              boxPanel;
private JLabel              boxTitleLabel;
private JTextArea           incomingMessagesJTextArea;
private JTextField          messageWritten;
private JButton             sendServerButton;

public static void main(String[] args){

    System.out.println("Client is running");
    new Client().createGUI();     //some swing GUI things
    new Client().createConnectionWithServer();
    new Client().sendTextToServer();
}

public void sendTextToServer(){

    try {
        message = "test";
        bw.write(message);  //null pointer exception
        bw.write('\n');
        bw.flush();

    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

public void createConnectionWithServer(){

    try {

        /** Create socket for communication between apps */
        socket = new Socket("localhost", port);

        /** Create inputs readers */
        isr = new InputStreamReader(socket.getInputStream());   //data in bytes format
        br = new BufferedReader(isr);                           //data in characters format

        /** Create output writers */
        osw = new OutputStreamWriter(socket.getOutputStream());
        bw = new BufferedWriter(osw);

    } catch (IOException e) {
        System.out.println("Server Error createConnectionWithServer(): " +e.getMessage());
    }

    /** Create new thread for read client-input data */
    new Thread(new Runnable() {
        public void run() {
            System.out.println("Client Thread - running");

            while (true) {

                try {
                    message = br.readLine();
                    System.out.println(message);

                } catch (IOException e) {
                    System.out.println("Client Error createServerConnection() -> new Thread: " +e.getMessage());
                }
            }
        }
    }
    ).start();
}}

更改您的主要方法以创建您的客户端的唯一实例class:

    public static void main(String[] args){
        Client client = new Client();
        System.out.println("Client is running");
        client.createGUI();     //some swing GUI things
        client.createConnectionWithServer();
        client.sendTextToServer();
    }

每次调用 "new" 语句时,您都在创建客户端 class 的新实例。这样做会在第一个实例中初始化变量,使另一个实例无法访问初始化变量(抛出 NullPointerException)