Home

Membuat Aplikasi Client-Server (Socket) di Java2SE

Berikut ini tutorial pembuatan aplikasi Client-Server atau Socket untuk chatting di Java2SE


Source Code:

 import java.io.BufferedReader;  
 import java.io.BufferedWriter;  
 import java.io.IOException;  
 import java.io.InputStreamReader;  
 import java.io.OutputStreamWriter;  
 import java.net.ServerSocket;  
 import java.net.Socket;  
 import java.net.UnknownHostException;  
 import java.util.logging.Level;  
 import java.util.logging.Logger;  
 import javax.swing.JFrame;  
 import javax.swing.JOptionPane;  
 import javax.swing.UIManager;  
 /*  
  * To change this template, choose Tools | Templates  
  * and open the template in the editor.  
  */  
 /**  
  *  
  * @author seroja
  */  
 public class MainFrame extends javax.swing.JFrame implements Runnable {  
   Socket client_socket;  
   ServerSocket server_socket;  
   BufferedReader server_reader, client_reader;  
   BufferedWriter server_writer, client_writer;  
   private void client_connection() {  
     try {  
       String server_ip = JOptionPane.showInputDialog("Input Server IP ");  
       if(server_ip == null) server_ip = "127.0.0.1";  
       jComboBoxMode.setEnabled(false);  
       jButtonConnect.setText("Disconnect");  
       client_socket = new Socket(server_ip, 8000);  
       server_reader = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));  
       server_writer = new BufferedWriter(new OutputStreamWriter(client_socket.getOutputStream()));  
     } catch (UnknownHostException ex) {  
       System.out.println("Connection Refused !");  
       System.exit(-1);  
     } catch (IOException ex) {  
       Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);  
     }  
   }  
   private void read_connection() {  
     try {  
       try {  
         try {  
           server_socket = new ServerSocket(8000);  
           this.setTitle("Waitting Client...");  
         } catch (IOException ex) {  
           System.out.println("Could not listen !");  
           System.exit(-1);  
         }  
         client_socket = server_socket.accept();  
         client_socket.getChannel().configureBlocking(false);  
         if(client_socket.isConnected()) {  
            this.setTitle("Connected " + client_socket.getInetAddress());  
         }else {  
           this.setTitle("Disconnect");  
         }  
       } catch (IOException ex) {  
         System.out.println("Connection Failed, Cannot Accept by Server!");  
         System.exit(-1);  
       }  
       server_reader = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));  
       server_writer = new BufferedWriter(new OutputStreamWriter(client_socket.getOutputStream()));  
     } catch (IOException ex) {  
       System.out.println("Read Failed");  
       System.exit(-1);  
     }  
   }  
   private void disconnected_by_client() {  
     try {  
       client_socket.close();  
       server_reader.close();  
       server_writer.close();  
       jComboBoxMode.setEnabled(true);  
       jButtonConnect.setText("Connect");  
     } catch (IOException ex) {  
       Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);  
     }  
   }  
   private void disconnected_by_server() {  
     try {  
       jButtonConnect.setText("Off");  
       this.setTitle("Disconnected");  
       server_socket.close();  
       server_reader.close();  
       server_writer.close();  
     } catch (IOException ex) {  
       Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);  
     }  
   }  
   /**  
    * Creates new form MainFrame  
    */  
   public MainFrame() {  
     initComponents();  
   }  
   /**  
    * 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();  
     jComboBoxMode = new javax.swing.JComboBox();  
     jLabel1 = new javax.swing.JLabel();  
     jTextFieldNickName = new javax.swing.JTextField();  
     jButtonConnect = new javax.swing.JButton();  
     jPanel2 = new javax.swing.JPanel();  
     jButtonSend = new javax.swing.JButton();  
     jTextFieldMessage = new javax.swing.JTextField();  
     jListConversations = new java.awt.List();  
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
     setResizable(false);  
     jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Settings"));  
     jComboBoxMode.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Server", "Client" }));  
     jComboBoxMode.addItemListener(new java.awt.event.ItemListener() {  
       public void itemStateChanged(java.awt.event.ItemEvent evt) {  
         jComboBoxModeItemStateChanged(evt);  
       }  
     });  
     jLabel1.setText("Nickname");  
     jTextFieldNickName.setEditable(false);  
     jTextFieldNickName.setText("Server");  
     jButtonConnect.setText("On");  
     jButtonConnect.addActionListener(new java.awt.event.ActionListener() {  
       public void actionPerformed(java.awt.event.ActionEvent evt) {  
         jButtonConnectActionPerformed(evt);  
       }  
     });  
     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);  
     jPanel1.setLayout(jPanel1Layout);  
     jPanel1Layout.setHorizontalGroup(  
       jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
       .addGroup(jPanel1Layout.createSequentialGroup()  
         .addContainerGap()  
         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)  
           .addGroup(jPanel1Layout.createSequentialGroup()  
             .addComponent(jLabel1)  
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)  
             .addComponent(jTextFieldNickName))  
           .addGroup(jPanel1Layout.createSequentialGroup()  
             .addComponent(jComboBoxMode, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)  
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)  
             .addComponent(jButtonConnect, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)))  
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))  
     );  
     jPanel1Layout.setVerticalGroup(  
       jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
       .addGroup(jPanel1Layout.createSequentialGroup()  
         .addContainerGap()  
         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)  
           .addComponent(jComboBoxMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)  
           .addComponent(jButtonConnect))  
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)  
         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)  
           .addComponent(jLabel1)  
           .addComponent(jTextFieldNickName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))  
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))  
     );  
     jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Conversation"));  
     jButtonSend.setText("Send");  
     jButtonSend.addActionListener(new java.awt.event.ActionListener() {  
       public void actionPerformed(java.awt.event.ActionEvent evt) {  
         jButtonSendActionPerformed(evt);  
       }  
     });  
     javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);  
     jPanel2.setLayout(jPanel2Layout);  
     jPanel2Layout.setHorizontalGroup(  
       jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
       .addGroup(jPanel2Layout.createSequentialGroup()  
         .addContainerGap()  
         .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
           .addComponent(jListConversations, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)  
           .addGroup(jPanel2Layout.createSequentialGroup()  
             .addComponent(jTextFieldMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)  
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)  
             .addComponent(jButtonSend, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE)  
             .addGap(0, 0, Short.MAX_VALUE)))  
         .addContainerGap())  
     );  
     jPanel2Layout.setVerticalGroup(  
       jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
       .addGroup(jPanel2Layout.createSequentialGroup()  
         .addContainerGap()  
         .addComponent(jListConversations, javax.swing.GroupLayout.DEFAULT_SIZE, 93, Short.MAX_VALUE)  
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)  
         .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)  
           .addComponent(jTextFieldMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)  
           .addComponent(jButtonSend))  
         .addContainerGap())  
     );  
     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)  
           .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)  
           .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))  
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))  
     );  
     layout.setVerticalGroup(  
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
       .addGroup(layout.createSequentialGroup()  
         .addContainerGap()  
         .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)  
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)  
         .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)  
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))  
     );  
     pack();  
   }// </editor-fold>              
   private void jComboBoxModeItemStateChanged(java.awt.event.ItemEvent evt) {                          
     if(jComboBoxMode.getSelectedItem().equals("Server")) {  
       jButtonConnect.setText("On");  
       jTextFieldNickName.setText("Server");  
     }else {  
       jButtonConnect.setText("Connect");  
       jTextFieldNickName.setText("Client");  
     }  
   }                         
   private void jButtonConnectActionPerformed(java.awt.event.ActionEvent evt) {                          
     if(jButtonConnect.getText().equals("Connect")) {  
       jButtonConnect.setText("Disconnect");  
       client_connection();  
       Thread thread = new Thread(this);  
       thread.start();  
     }else if(jButtonConnect.getText().equals("On")){  
       jButtonConnect.setText("Off");  
       read_connection();  
       Thread thread = new Thread(this);  
       thread.start();  
     }else if(jButtonConnect.getText().equals("Disconnect")) {  
       jButtonConnect.setText("On");  
       disconnected_by_client();  
     }else if(jButtonConnect.getText().equals("Off")) {  
       disconnected_by_server();  
     }  
   }                         
   private void jButtonSendActionPerformed(java.awt.event.ActionEvent evt) {                        
     try {  
       server_writer.write(jTextFieldNickName.getText() + ": " + jTextFieldMessage.getText());  
       server_writer.newLine();  
       server_writer.flush();  
     } catch (IOException ex) {  
       Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);  
     }  
     jListConversations.add("me: " + jTextFieldMessage.getText());  
     jTextFieldMessage.setText("");  
   }                        
   /**  
    * @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 {  
       UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");  
     } catch (Exception e) {  
       System.out.println("Nimbus isn't available");  
     }   
     //</editor-fold>  
     /* Create and display the form */  
     java.awt.EventQueue.invokeLater(new Runnable() {  
       public void run() {  
         new MainFrame().setVisible(true);  
         new MainFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
       }  
     });  
   }  
   // Variables declaration - do not modify             
   private javax.swing.JButton jButtonConnect;  
   private javax.swing.JButton jButtonSend;  
   private javax.swing.JComboBox jComboBoxMode;  
   private javax.swing.JLabel jLabel1;  
   private java.awt.List jListConversations;  
   private javax.swing.JPanel jPanel1;  
   private javax.swing.JPanel jPanel2;  
   private javax.swing.JTextField jTextFieldMessage;  
   private javax.swing.JTextField jTextFieldNickName;  
   // End of variables declaration            
   @Override  
   public void run() {  
     while(true){  
       try {  
         jListConversations.add(server_reader.readLine());  
       } catch (IOException ex) {  
         Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);  
       }  
     }  
   }  
 }  

0 komentar:

Posting Komentar