2016-12-19 2 views
0

Es ist eine einfache Chat-App. Server und Client als separate App. Verbindung zwischen Server und Client funktioniert einwandfrei. Ich habe ein Problem, wenn ich versuche, String von Client von BufferedWriter an Server BufferedReader zu senden. Ich habe eine Nullzeiger-Ausnahme.
Und können Sie mir sagen, dass alles in Ordnung mit Threads Logik in dieser App ist?Java BufferedWriter bei Verbindung zum Server - Nullzeiger Ausnahme - Chat App

Server App

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(); 

}} 

Client-App

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(); 
}} 

Antwort

1

Ihre Hauptmethode ändern einzigartige Instanz der Client-Klasse zu erstellen:

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(); 
    } 

Sie haben eine neue Instanz der Erstellung von die Client-Klasse jedes Mal, wenn Sie die "neue" Anweisung aufgerufen haben. Dadurch wurde die Variable in der ersten Instanz initialisiert, was dem anderen den Zugriff auf die initialisierte Variable unmöglich machte (NullPointerException wurde geworfen)