Java Server-Client chat uygulaması giriş ekranlarıyla birlikte çalışmıyor

WhiteFountain

Kilopat
Katılım
8 Temmuz 2017
Mesajlar
2.057
Makaleler
1
Çözümler
19
Selamlar, java dilinde swing ui kullanarak server-client'ı olan bir chat uygulaması yapıyorum. Giriş ekranları olmadan server ve client birbiri ile mesajlaşabiliyor fakat nedense log ekranları yaptığım zaman çalışmıyor. Log ekranının kodlarında server ve client nesnesi oluşturuyorum fakat mesaj göndermeye çalıştığımda aldığım hatalar;

java.lang.NullPointerException: Cannot invoke "java.io.DataOutputStream.writeUTF(String)" because "chatapp.chat_server.dout" is null
java.lang.NullPointerException: Cannot invoke "java.io.DataOutputStream.writeUTF(String)" because "chatapp.chat_client.dout" is null bu şekilde.



Sırasıyla server kodları;
Java:
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package chatapp;

import java.awt.Color;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;

/**
 *
 * @author eraya
 */
public class chat_server extends javax.swing.JFrame {

    /**
     * Creates new form chat_server
     */
   
   
    static ServerSocket ss;
    static Socket s;
    static DataInputStream din;
    static DataOutputStream dout;
   
     
    public chat_server() {
        initComponents();
        Color color = new Color(182,182,182);
        getContentPane().setBackground(color);
       
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        msg_area = new javax.swing.JTextArea();
        msg_send = new javax.swing.JButton();
        msg_text = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("CHAT-SERVER");
        setBackground(new java.awt.Color(102, 255, 102));

        msg_area.setColumns(20);
        msg_area.setRows(5);
        jScrollPane1.setViewportView(msg_area);

        msg_send.setText("GÖNDER");
        msg_send.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                msg_sendActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(6, 6, 6)
                        .addComponent(msg_text)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(msg_send))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 377, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 317, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(msg_text)
                    .addComponent(msg_send, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE))
                .addContainerGap(15, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                      

    private void msg_sendActionPerformed(java.awt.event.ActionEvent evt) {                                        
         try{
           String msgout = "";
           msgout = msg_text.getText().trim();
           dout.writeUTF(msgout); // SERVER CLIENT'E MESAJ GÖNDERİYOR.
        }catch(Exception e){
            System.out.println("Hata oluştu, hata kodunuz: "+e);
        }      
       
    }                                      

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(chat_server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(chat_server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(chat_server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(chat_server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new chat_server().setVisible(true);
            }
        });
        String msgin = "";
       
        try{
            ss = new ServerSocket(1201); // SUNUCU 1201 PORTUNDA AÇILIR
            s = ss.accept(); // SUNUCU BAGLANTIYI KABUL EDER
            din = new DataInputStream(s.getInputStream());
            dout = new DataOutputStream(s.getOutputStream());
           
            while(!msgin.equals("exit")){
                msgin = din.readUTF();
                msg_area.setText(msg_area.getText().trim()+"\n Client: \t"+msgin); // CLIENT  MESAJ EKRANA GÖSTERİLİR
            }
           
        }catch(Exception e){
            System.out.println("Hata oluştu, hata kodunuz: "+e);
           
        }
      
       
       
    }

    // Variables declaration - do not modify                    
    private javax.swing.JScrollPane jScrollPane1;
    private static javax.swing.JTextArea msg_area;
    private javax.swing.JButton msg_send;
    private javax.swing.JTextField msg_text;
    // End of variables declaration                  

   
}

Client kodları;
Java:
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package chatapp;

import java.awt.Color;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

/**
 *
 * @author eraya
 */
public class chat_client extends javax.swing.JFrame {

    /**
     * Creates new form chat_client
     */
   
    static Socket s;
    static DataInputStream din;
    static DataOutputStream dout;
   
    public chat_client() {
        initComponents();
        Color color = new Color(182,182,182);
        getContentPane().setBackground(color);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        msg_area = new javax.swing.JTextArea();
        msg_send = new javax.swing.JButton();
        msg_text = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("CHAT-CLIENT");
        setPreferredSize(new java.awt.Dimension(497, 413));

        msg_area.setColumns(20);
        msg_area.setRows(5);
        jScrollPane1.setViewportView(msg_area);

        msg_send.setText("GÖNDER");
        msg_send.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                msg_sendActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane1)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(11, 11, 11)
                        .addComponent(msg_text, javax.swing.GroupLayout.PREFERRED_SIZE, 281, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(msg_send, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(12, 12, 12)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 311, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(msg_text)
                    .addComponent(msg_send, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE))
                .addContainerGap(15, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                      

    private void msg_sendActionPerformed(java.awt.event.ActionEvent evt) {                                        
        try{
            String msgout = "";
            msgout = msg_text.getText().trim();
            dout.writeUTF(msgout);
           
           
        }catch(Exception e){
            System.out.println("Hata oluştu, hata kodunuz: "+e);
        }
    }                                      

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(chat_client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(chat_client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(chat_client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(chat_client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new chat_client().setVisible(true);
            }
        });
        try{
          s = new Socket("127.0.0.1",1201);
        din = new DataInputStream(s.getInputStream());
        dout = new DataOutputStream(s.getOutputStream());
        String msgin = "";
        while(!msgin.equals("exit")){
            msgin = din.readUTF();
            msg_area.setText(msg_area.getText().trim()+"\n Server: \t"+msgin);
        }try{
          s = new Socket("127.0.0.1",1201);
        din = new DataInputStream(s.getInputStream());
        dout = new DataOutputStream(s.getOutputStream());
        String msgin = "";
        while(!msgin.equals("exit")){
            msgin = din.readUTF();
            msg_area.setText(msg_area.getText().trim()+"\n Server: \t"+msgin);
        }
       
        }catch(Exception e){
            System.out.println("Hata oluştu, hata kodunuz: "+e);
        }
       
        }catch(Exception e){
            System.out.println("Hata oluştu, hata kodunuz: "+e);
        }
       
       
       
       
    }

    // Variables declaration - do not modify                    
    private javax.swing.JScrollPane jScrollPane1;
    private static javax.swing.JTextArea msg_area;
    private javax.swing.JButton msg_send;
    private javax.swing.JTextField msg_text;
    // End of variables declaration                  
}

Login ekranları zaten çok benzer örnek olarak client login ekranı;
Java:
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package chatapp;

import java.awt.Color;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 *
 * @author eraya
 */
public class chatclient_login extends javax.swing.JFrame {
    chat_client clientFrame = new chat_client();
    /**
     * Creates new form chatclient_login
     */
    public chatclient_login() {
        initComponents();
        scaleImage();
        Color color = new Color(255,255,255);
        getContentPane().setBackground(color);
    }
   
   
    public void scaleImage(){
        ImageIcon icon = new ImageIcon("C:\\Users\\eraya\\Pictures\\image.jpg");
        Image img = icon.getImage();
        Image imgScale = img.getScaledInstance(lblImage.getWidth(),lblImage.getHeight(),Image.SCALE_SMOOTH);
        ImageIcon scaledIcon = new ImageIcon(imgScale);
        lblImage.setIcon(scaledIcon);
       
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        lblImage = new javax.swing.JLabel();
        lblUserName = new javax.swing.JLabel();
        lblPassword = new javax.swing.JLabel();
        txtPassword = new javax.swing.JPasswordField();
        txtUsername = new javax.swing.JTextField();
        btnLogin = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));

        lblUserName.setFont(new java.awt.Font("Segoe UI Historic", 0, 18)); // NOI18N
        lblUserName.setText("USERNAME:");

        lblPassword.setFont(new java.awt.Font("Segoe UI Historic", 0, 18)); // NOI18N
        lblPassword.setText("PASSWORD:");

        txtPassword.setText("jPasswordField1");

        btnLogin.setText("LOGIN");
        btnLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLoginActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Segoe UI", 0, 14)); // NOI18N
        jLabel1.setText("CLIENT USER LOGIN PAGE");
        jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(48, 48, 48)
                        .addComponent(lblImage, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(lblUserName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(lblPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(txtPassword)
                            .addComponent(txtUsername, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(71, 71, 71)
                        .addComponent(btnLogin, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                        .addGap(40, 40, 40)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(22, 22, 22)))
                .addContainerGap(60, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(47, 47, 47)
                .addComponent(lblImage, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabel1)
                .addGap(8, 8, 8)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblUserName)
                    .addComponent(txtUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(27, 27, 27)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblPassword)
                    .addComponent(txtPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(btnLogin)
                .addContainerGap(43, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                      

    private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                        
        if(txtUsername.getText().equals("")){
            JOptionPane.showMessageDialog(null," kullanıcı adı giriniz.");
           
        }
        else if(txtPassword.getText().equals("")){
            JOptionPane.showMessageDialog(null, " şifre giriniz.");
        }
        else if(txtUsername.getText().equals("admin")&&txtPassword.getText().equals("admin")){
            JOptionPane.showMessageDialog(null, "Giriş başarılı");
            // Kullanıcı adı ve şifre doğru ise login ekranını kapat ve client ekranını aç
        dispose(); // Login ekranını kapat
        clientFrame.setVisible(true); // Client ekranını aç
        }
        else{
            JOptionPane.showMessageDialog(null, "Hatalı şifre veya kullanıcı adı.","Tekrar deneyiniz.",JOptionPane.ERROR_MESSAGE);
        }
    }                                      

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(chatclient_login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(chatclient_login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(chatclient_login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(chatclient_login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new chatclient_login().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                    
    private javax.swing.JButton btnLogin;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel lblImage;
    private javax.swing.JLabel lblPassword;
    private javax.swing.JLabel lblUserName;
    private javax.swing.JPasswordField txtPassword;
    private javax.swing.JTextField txtUsername;
    // End of variables declaration                  
}
 
"dout" initialize olmadan mesaj göndermeye çalıştığın için nullref veriyor. sorun muhtemelen buton'a eklediğin action listener'ın çok erken call edilmesi.

basit bir çözüm için tüm dosyalardaki "dout.writeUTF(msgout);" satırını
if (dout && dout.writeUTF) { dout.writeUTF(msgout); }
ile değiştir.
 
java.lang.NullPointerException: Cannot invoke "java.io.DataOutputStream.writeUTF(String)" because "chatapp.chat_client.dout"

chat_client sınıfında static DataOutputStream dout; diye tanımlamışsın.
dout = new DataOutputStream(s.getOutputStream()); şeklinde initialize ediliyor ama bu main method içinde.
Kodunu çalıştırırken bu initialize işlemi yapılan satıra breakpoint koyarak debuglarsan, initialize işleminin yapılıp yapılmadığını görebilirsin.
 
"dout" initialize olmadan mesaj göndermeye çalıştığın için nullref veriyor. sorun muhtemelen buton'a eklediğin action listener'ın çok erken call edilmesi.

basit bir çözüm için tüm dosyalardaki "dout.writeUTF(msgout);" satırını
if (dout && dout.writeUTF) { dout.writeUTF(msgout); }
ile değiştir.
1703428771504.png

Hocam verdiğiniz kod hata veriyor.
 
Javayı sevmemek için bir sebep daha.. null olup olmadığını kontrol etmek için saçma sapan metodlar kullanmak gerekiyor. Normalde Java ile kod yazmadığım için c#'daki alışkanlıklarıma göre yanıt yazmıştım, hata veriyormuş.

Kaçamak bir çözüm olacak ama direkt şöyle yapın

try{ dout.writeUTF(msgout); } catch { }
 
Javayı sevmemek için bir sebep daha.. null olup olmadığını kontrol etmek için saçma sapan metodlar kullanmak gerekiyor. Normalde Java ile kod yazmadığım için c#'daki alışkanlıklarıma göre yanıt yazmıştım, hata veriyormuş.

Kaçamak bir çözüm olacak ama direkt şöyle yapın

try{ dout.writeUTF(msgout); } catch { }
Maalesef hocam bir şeyi değiştirmedi.
 
java.lang.NullPointerException: Cannot invoke "java.io.DataOutputStream.writeUTF(String)" because "chatapp.chat_client.dout"

chat_client sınıfında static DataOutputStream dout; diye tanımlamışsın.
dout = new DataOutputStream(s.getOutputStream()); şeklinde initialize ediliyor ama bu main method içinde.
Kodunu çalıştırırken bu initialize işlemi yapılan satıra breakpoint koyarak debuglarsan, initialize işleminin yapılıp yapılmadığını görebilirsin.

Madem debug etmeyi sevmiyorsun, biraz daha ipucu vereyim.

Bu eklediğin kodları run ya da debug ettiğin zaman main method ile çağrılıyor. Yani server ve client kodlarını run ettin, main method içinde ne varsa ona göre çalışmaya başlıyorlar.

Sorun ne burada, null pointer exception alıyorsun, chat_client sınıfındaki dout yani dataoutputstream null. Null demek ne demek, bu nesne henüz oluşturulmamış demek.

Sen server ve client sınıflarını run ettin, ne oldu main methodları çalıştı. Main methodunun içinde ne mevcut? dout = new DataOutputStream(s.getOutputStream()); diye bir kod mevcut. Yani sen bu iki sınıfı run edince dout nesnesi oluşturuluyor mu? Oluşturuluyor. Client ve server iletişim kurabiliyor mu bu sayede? Kurabiliyor. Buraya kadar cepte, harika.

Şimdi sen buradaki client yerine login mekanizması eklemek istediğin için chatclient_login diye bir sınıf ekledin. Bu sınıf ne yaptı? chat_client clientFrame = new chat_client(); koduyla yeni bir client nesnesi oluşturdu. Güzel.

Peki sence böyle nesne oluşturunca client sınıfının main methodu çalıştı mı? dout = new DataOutputStream(s.getOutputStream()); diye nesne yaratan kod çalıştı mı?

Satır satır debug yaparsan javanın nasıl çalıştığını öğrenmeye başlarsın, yazdığın kodun nasıl çalıştığını anlarsın, hatayı da bulursun, çözüm de üretirsin. Copy paste kod kullanırsan, debug da yapmazsan ilerleyemezsin. Kolay gelsin.


Javayı sevmemek için bir sebep daha.. null olup olmadığını kontrol etmek için saçma sapan metodlar kullanmak gerekiyor. Normalde Java ile kod yazmadığım için c#'daki alışkanlıklarıma göre yanıt yazmıştım, hata veriyormuş.

Kaçamak bir çözüm olacak ama direkt şöyle yapın

try{ dout.writeUTF(msgout); } catch { }

dout != null kullanılıyor null check için (saçma sapan methodlar?)

"dout" initialize olmadan mesaj göndermeye çalıştığın için nullref veriyor. sorun muhtemelen buton'a eklediğin action listener'ın çok erken call edilmesi.

basit bir çözüm için tüm dosyalardaki "dout.writeUTF(msgout);" satırını
if (dout && dout.writeUTF) { dout.writeUTF(msgout); }
ile değiştir.

Null olduğunu fark etmişsiniz, null check de yaptınız diyelim bu şekilde, çözümü bu kod mu sizce, initialize olmamış nesnenin istediğimiz gibi çalışmasını sağlayacak mı bu kod? (javadan bağımsız soruyorum)
 
Son düzenleme:
Madem debug etmeyi sevmiyorsun, biraz daha ipucu vereyim.

Bu eklediğin kodları run ya da debug ettiğin zaman main method ile çağrılıyor. Yani server ve client kodlarını run ettin, main method içinde ne varsa ona göre çalışmaya başlıyorlar.

Sorun ne burada, null pointer exception alıyorsun, chat_client sınıfındaki dout yani dataoutputstream null. Null demek ne demek, bu nesne henüz oluşturulmamış demek.

Sen server ve client sınıflarını run ettin, ne oldu main methodları çalıştı. Main methodunun içinde ne mevcut? dout = new DataOutputStream(s.getOutputStream()); diye bir kod mevcut. Yani sen bu iki sınıfı run edince dout nesnesi oluşturuluyor mu? Oluşturuluyor. Client ve server iletişim kurabiliyor mu bu sayede? Kurabiliyor. Buraya kadar cepte, harika.

Şimdi sen buradaki client yerine login mekanizması eklemek istediğin için chatclient_login diye bir sınıf ekledin. Bu sınıf ne yaptı? chat_client clientFrame = new chat_client(); koduyla yeni bir client nesnesi oluşturdu. Güzel.

Peki sence böyle nesne oluşturunca client sınıfının main methodu çalıştı mı? dout = new DataOutputStream(s.getOutputStream()); diye nesne yaratan kod çalıştı mı?

Satır satır debug yaparsan javanın nasıl çalıştığını öğrenmeye başlarsın, yazdığın kodun nasıl çalıştığını anlarsın, hatayı da bulursun, çözüm de üretirsin. Copy paste kod kullanırsan, debug da yapmazsan ilerleyemezsin. Kolay gelsin.




dout != null kullanılıyor null check için (saçma sapan methodlar?)



Null olduğunu fark etmişsiniz, null check de yaptınız diyelim bu şekilde, çözümü bu kod mu sizce, initialize olmamış nesnenin istediğimiz gibi çalışmasını sağlayacak mı bu kod? (javadan bağımsız soruyorum)
Hocam o zaman mainde çalışması gerek metodlar için onları çalıştıran metodu ayrı yazıp ana sınıfların
constructorlarıdna çağırmam mı gerek ?
 

Yeni konular

Geri
Yukarı