Monday, October 5, 2020

Implementasi Socket TCP Asynchrounus Menggunakan Java Swing







/*
---------------------------------------------------------
 Dodit Suprianto dodit.suprianto@polinema.ac.id
 Mata Kuliah Pemrograman Jaringan
 September 2020, Implementasi Socket TCP pada Java Swing
 http://doditsuprianto.blogspot.com
---------------------------------------------------------
 Thanks and Credit to Steven Ou (ochinchina)
 https://gist.github.com/ochinchina/72cc23220dc8a933fc46
---------------------------------------------------------
 */

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.atomic.AtomicInteger;

import java.nio.channels.AsynchronousServerSocketChannel;

public class frmDemoSocketJava {
   
private JTabbedPane tabbedPane1;
   
private JPanel panel1;
   
private JTextField txtPortServer;
   
private JTextField txtIPServer;
   
private JButton btnListen;
   
private JTextField txtPesanDiterimaServer;
   
private JTextField txtPortClient;
   
private JTextField txtAlamatIPTujuan;
   
private JTextField txtPesanDikirimKeServer;
   
private JButton btnKirim;

   
public frmDemoSocketJava() {
       
btnListen.addActionListener(new ActionListener() {
           
@Override
           
public void actionPerformed(ActionEvent e) {
               
//JOptionPane.showMessageDialog(null, "Tombol LISTENER diklik");
               
try {
                   
new Thread(() -> {
                       
try {
                            EchoServer(
txtIPServer.getText(), Integer.parseInt(txtPortServer.getText()));
                        }
catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                    }).start();
                }
catch(Exception ex) {
                   
JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
        });

       
btnKirim.addActionListener(new ActionListener() {
           
@Override
           
public void actionPerformed(ActionEvent e) {
               
//JOptionPane.showMessageDialog(null, "Tombol KIRIM diklik");
               
try {
                   
AtomicInteger messageWritten = new AtomicInteger(0);
                   
AtomicInteger messageRead = new AtomicInteger(0);

                    EchoClient(
txtAlamatIPTujuan.getText(), Integer.parseInt(txtPortClient.getText()), txtPesanDikirimKeServer.getText(), messageWritten, messageRead);
                }
catch (Exception ex) {
                   
JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
        });
    }

   
public static void main(String[] args){
       
JFrame gui = new JFrame("Socket Java");
       
gui.setContentPane(new frmDemoSocketJava().panel1);
       
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
gui.pack();
       
gui.setVisible(true);
    }

   
//////////////////////////
    // Socket Client Helper //
    //////////////////////////
   
public void EchoClient( String host, int port, final String message, final AtomicInteger messageWritten, final AtomicInteger messageRead ) throws IOException {
       
//create a socket channel
       
AsynchronousSocketChannel sockChannel = AsynchronousSocketChannel.open();

       
//try to connect to the server side
       
sockChannel.connect( new InetSocketAddress(host, port), sockChannel, new CompletionHandler<Void, AsynchronousSocketChannel >() {
           
@Override
           
public void completed(Void result, AsynchronousSocketChannel channel ) {
               
//start to read message
               
startRead( channel,messageRead );

               
//write an message to server side
               
startWrite( channel, message, messageWritten );
            }

           
@Override
           
public void failed(Throwable exc, AsynchronousSocketChannel channel) {
               
System.out.println( "fail to connect to server");
            }

        });
    }

   
private void startRead( final AsynchronousSocketChannel sockChannel, final AtomicInteger messageRead ) {
       
final ByteBuffer buf = ByteBuffer.allocate(2048);

        sockChannel.read(
buf, sockChannel, new CompletionHandler<Integer, AsynchronousSocketChannel>(){

           
@Override
           
public void completed(Integer result, AsynchronousSocketChannel channel) {
               
//message is read from server
               
messageRead.getAndIncrement();

               
//print the message
               
System.out.println( "Read message:" + new String( buf.array()) );
            }

           
@Override
           
public void failed(Throwable exc, AsynchronousSocketChannel channel) {
               
System.out.println( "fail to read message from server");
            }
        });
    }

   
private void startWrite( final AsynchronousSocketChannel sockChannel, final String message, final AtomicInteger messageWritten ) {
       
ByteBuffer buf = ByteBuffer.allocate(2048);
       
buf.put(message.getBytes());
       
buf.flip();
        messageWritten.getAndIncrement();
        sockChannel.write(
buf, sockChannel, new CompletionHandler<Integer, AsynchronousSocketChannel >() {
           
@Override
           
public void completed(Integer result, AsynchronousSocketChannel channel ) {
               
//after message written
                //NOTHING TO DO
           
}

           
@Override
           
public void failed(Throwable exc, AsynchronousSocketChannel channel) {
               
System.out.println( "Fail to write the message to server");
            }
        });
    }

   
///////////////////
    // Socket Server //
    //////////////////
   
public void EchoServer( String bindAddr, int bindPort ) throws IOException {
       
InetSocketAddress sockAddr = new InetSocketAddress(bindAddr, bindPort);

       
//create a socket channel and bind to local bind address
       
AsynchronousServerSocketChannel serverSock AsynchronousServerSocketChannel.open().bind(sockAddr);

       
//start to accept the connection from client
       
serverSock.accept(serverSock, new CompletionHandler<AsynchronousSocketChannel,AsynchronousServerSocketChannel >() {

           
@Override
           
public void completed(AsynchronousSocketChannel sockChannel, AsynchronousServerSocketChannel serverSock ) {
               
//a connection is accepted, start to accept next connection
               
serverSock.accept( serverSock, this );
               
//start to read message from the client
               
startRead( sockChannel );

            }

           
@Override
           
public void failed(Throwable exc, AsynchronousServerSocketChannel serverSock) {
               
System.out.println( "fail to accept a connection");
            }

        });
    }

   
private void startRead( AsynchronousSocketChannel sockChannel ) {
       
final ByteBuffer buf = ByteBuffer.allocate(2048);

       
//read message from client
       
sockChannel.read( buf, sockChannel, new CompletionHandler<Integer, AsynchronousSocketChannel >() {

           
/**
             * some message is read from client, this callback will be called
             */
           
@Override
           
public void completed(Integer result, AsynchronousSocketChannel channel  ) {
               
buf.flip();

               
// echo the message
               
startWrite( channel, buf );

               
//start to read next message again
               
startRead( channel );

               
// menampilkan string pesan ke textfield txtPesanDiterimaServer
               
txtPesanDiterimaServer.setText(new String( buf.array()));
            }

           
@Override
           
public void failed(Throwable exc, AsynchronousSocketChannel channel ) {
               
System.out.println( "fail to read message from client");
            }
        });
    }

   
private void startWrite( AsynchronousSocketChannel sockChannel, final ByteBuffer buf) {
        sockChannel.write(buf, sockChannel,
new CompletionHandler<Integer, AsynchronousSocketChannel >() {

           
@Override
           
public void completed(Integer result, AsynchronousSocketChannel channel) {
               
//finish to write message to client, nothing to do
           
}

           
@Override
           
public void failed(Throwable exc, AsynchronousSocketChannel channel) {
               
//fail to write message to client
               
System.out.println( "Fail to write message to client");
            }

        });
    }
}

 


Download source code github https://github.com/doditsuprianto/Implementasi-Socket-TCP-dengan-Java-Swing