2016-12-19 5 views
0

Это простое приложение для чата. Сервер и клиент как отдельное приложение. Соединение между сервером и клиентом работает нормально. У меня проблема, когда я пытаюсь отправить String из Client BufferedWriter в Server BufferedReader. У меня есть исключение null-указателя.
И можете ли вы сказать мне, что все в порядке с логикой потоков в этом приложении?Java BufferedWriter при подключении к серверу - исключение null указателя - приложение для чата

приложение Сервер

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

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

ответ

1

Измените основной метод, чтобы создать уникальный экземпляр вашего класса Client:

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

Вы создавали новый экземпляр класс Client каждый раз, когда вы вызываете «новый» оператор. Это значит, что переменная была инициализирована в первом экземпляре, что делает невозможным для другого доступ к инициализированной переменной (бросание NullPointerException)

Смежные вопросы