Showing posts with label Network programming. Show all posts
Showing posts with label Network programming. Show all posts

Wednesday, July 20, 2016

Java example of SSL Server and Client, and how to generate keystore

Here are examples of Java SSL Server and Client.



JavaSSLServer.java
package javasslserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLServerSocketFactory;

/**
 * @web http://java-buddy.blogspot.com/
 */
public class JavaSSLServer {
    
    static final int port = 8000;

    public static void main(String[] args) {
        
        
        SSLServerSocketFactory sslServerSocketFactory = 
                (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
        
        try {
            ServerSocket sslServerSocket = 
                    sslServerSocketFactory.createServerSocket(port);
            System.out.println("SSL ServerSocket started");
            System.out.println(sslServerSocket.toString());
            
            Socket socket = sslServerSocket.accept();
            System.out.println("ServerSocket accepted");
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            try (BufferedReader bufferedReader = 
                    new BufferedReader(
                            new InputStreamReader(socket.getInputStream()))) {
                String line;
                while((line = bufferedReader.readLine()) != null){
                    System.out.println(line);
                    out.println(line);
                }
            }
            System.out.println("Closed");
            
        } catch (IOException ex) {
            Logger.getLogger(JavaSSLServer.class.getName())
                    .log(Level.SEVERE, null, ex);
        }
    }
    
}


JavaSSLClient.java
package javasslclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLSocketFactory;

/**
 * @web http://java-buddy.blogspot.com/
 */
public class JavaSSLClient {
    
    static final int port = 8000;

    public static void main(String[] args) {
        
        SSLSocketFactory sslSocketFactory = 
                (SSLSocketFactory)SSLSocketFactory.getDefault();
        try {
            Socket socket = sslSocketFactory.createSocket("localhost", port);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            try (BufferedReader bufferedReader = 
                    new BufferedReader(
                            new InputStreamReader(socket.getInputStream()))) {
                Scanner scanner = new Scanner(System.in);
                while(true){
                    System.out.println("Enter something:");
                    String inputLine = scanner.nextLine();
                    if(inputLine.equals("q")){
                        break;
                    }
                    
                    out.println(inputLine);
                    System.out.println(bufferedReader.readLine());
                }
            }
            
        } catch (IOException ex) {
            Logger.getLogger(JavaSSLClient.class.getName())
                    .log(Level.SEVERE, null, ex);
        }
         
    }
    
}



Without keystore, both the server and client will fail. This video show how to generate keystore using keytool program. Then run server and client with keystore and password.


Type the following command in your command window to create a keystore named examplestore and to generate keys:

$ keytool -genkey -alias signFiles -keystore examplestore

You will be prompted to enter passwords for the key and keystore. The password in this example is "password".

(reference: https://docs.oracle.com/javase/tutorial/security/toolsign/step3.html)

Run SSL server and client by entering the commands:
$ java -jar -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password "...JavaSSLServer.jar"
$ java -jar -Djavax.net.ssl.trustStore=keystore -Djavax.net.ssl.trustStorePassword=password "...JavaSSLClient.jar"


Saturday, February 15, 2014

Simple example of UDP Client/Server communication

It's a simple example to implement UDP Client/Server in Java. To test the function, start JavaUDPServer with port number in Terminal. The server will open a DatagramSocket and wait for incoming message from client. Then start JavaUDPClient with IP address and port number in another Terminal, then enter anything. The user input will be sent to JavaUDPServer via UDP socket, when JavaUDPServer receive the message, it will echo back to JavaUDPClient, then both JavaUDPServer and JavaUDPClient close the socket.

JavaUDPServer

JavaUDPClient

JavaUDPServer.java
package javaudpserver;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaUDPServer {
    
    private static DatagramSocket datagramSocket;

    private static final int BUFFER_SIZE = 1024;
    private static byte[] buffer;

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("usage: java -jar JavaUDPServer.jar <port>");
            System.exit(1);
        }
        
        int port = Integer.parseInt(args[0]);
        System.out.println("Port: " + port);
        try {
            datagramSocket = new DatagramSocket(port);
            
            buffer = new byte[BUFFER_SIZE];
            
            DatagramPacket in_datagramPacket = new DatagramPacket(
                    buffer, BUFFER_SIZE);
            datagramSocket.receive(in_datagramPacket);
            
            InetAddress clientAddress = in_datagramPacket.getAddress();
            int clientPort = in_datagramPacket.getPort();
            
            String in_message = new String(
                    in_datagramPacket.getData(), 
                    0, 
                    in_datagramPacket.getLength());
            System.out.println("received: " + in_message);
            
            String out_messagae = "echo: " + in_message;
            DatagramPacket out_datagramPacket= new DatagramPacket(
                    out_messagae.getBytes(), 
                    out_messagae.length(), 
                    clientAddress, 
                    clientPort);
            datagramSocket.send(out_datagramPacket);
            
        } catch (SocketException ex) {
            Logger.getLogger(JavaUDPServer.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(JavaUDPServer.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            datagramSocket.close();
        }

    }
    
}


JavaUDPClient.java
package javaudpclient;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaUDPClient {
    
    private static DatagramSocket datagramSocket;
    
    private static final int BUFFER_SIZE = 1024;
    private static byte[] buffer;

    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("usage: java -jar JavaUDPClient.jar <IP address> <port>");
            System.exit(1);
        }
        try {
            InetAddress inetAddress = InetAddress.getByName(args[0]);
            int port = Integer.parseInt(args[1]);
            
            Scanner userScanner = new Scanner(System.in);
            String userInput = userScanner.nextLine();
            
            datagramSocket = new DatagramSocket();
            
            DatagramPacket out_datagramPacket = new DatagramPacket(
                    userInput.getBytes(), 
                    userInput.length(), 
                    inetAddress, 
                    port);
            
            datagramSocket.send(out_datagramPacket);
            
            buffer = new byte[BUFFER_SIZE];
            DatagramPacket in_datagramPacket = 
                    new DatagramPacket(buffer, BUFFER_SIZE);
            datagramSocket.receive(in_datagramPacket);
            
            String serverEcho = new String(
                    in_datagramPacket.getData(), 
                    0, 
                    in_datagramPacket.getLength());
            System.out.println(serverEcho);
            
        } catch (UnknownHostException ex) {
            Logger.getLogger(JavaUDPClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SocketException ex) {
            Logger.getLogger(JavaUDPClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(JavaUDPClient.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            datagramSocket.close();
        }
    }
    
}





Compare with: Simple example of TCP Client/Server communication


Friday, February 14, 2014

Simple example of TCP Client/Server communication

It's a simple example to implement TCP Client/Server in Java. To test the function, start JavaTCPServer with port number in Terminal. The server will open a ServerSocket and wait for incoming message from client. Then start JavaTCPClient with IP address and port number in another Terminal, then enter anything. The user input will be sent to JavaTCPServer via TCP socket, when JavaTCPServer receive the message, it will echo back to JavaTCPClient, then both JavaTCPServer and JavaTCPClient close the socket.

TCP Client/Server communication
TCP Client/Server communication

JavaTCPServer.java
package javatcpserver;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaTCPServer {

    private static int port;
    private static ServerSocket serverSocket;

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("usage: java -jar JavaTCPServer.jar <port>");
            System.exit(1);
        }

        port = Integer.parseInt(args[0]);
        System.out.println("Port: " + port);

        Socket socket = null;
        try {
            serverSocket = new ServerSocket(port);

            socket = serverSocket.accept();
            Scanner scanner = new Scanner(socket.getInputStream());
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);

            String line = scanner.nextLine();

            System.out.println("received: " + line);
            printWriter.println("echo: " + line);
        } catch (IOException ex) {
            Logger.getLogger(JavaTCPServer.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException ex) {
                    Logger.getLogger(JavaTCPServer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }

    }

}

JavaTCPClient.java
package javatcpclient;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaTCPClient {

    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("usage: java -jar JavaTCPClient.jar <IP address> <port>");
            System.exit(1);
        }
        
        Socket socket = null;
        try {
            InetAddress inetAddress = InetAddress.getByName(args[0]);
            int port = Integer.parseInt(args[1]);
            
            socket = new Socket(inetAddress, port);
            System.out.println("InetAddress: " + inetAddress);
            System.out.println("Port: " + port);
            
            Scanner scanner = new Scanner(socket.getInputStream());
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            
            Scanner userScanner = new Scanner(System.in);
            String userInput = userScanner.nextLine();
            
            printWriter.println(userInput);
            String serverEcho = scanner.nextLine();
            System.out.println(serverEcho);

        } catch (UnknownHostException ex) {
            Logger.getLogger(JavaTCPClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(JavaTCPClient.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if( socket != null){
                try {
                    socket.close();
                } catch (IOException ex) {
                    Logger.getLogger(JavaTCPClient.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
    
}





Compare with: Simple example of UDP Client/Server communication

Get address of local host with InetAddress.getLocalHost()


  • InetAddress.getLocalHost() returns the address of the local host. This is achieved by retrieving the name of the host from the system, then resolving that name into an InetAddress.
InetAddress.getLocalHost()
InetAddress.getLocalHost()

package javaexnetworking;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaExNetworking {
    
    public static void main(String[] args) {
        try {
            InetAddress localHostAddress = InetAddress.getLocalHost();
            System.out.println(localHostAddress);
        } catch (UnknownHostException ex) {
            Logger.getLogger(JavaExNetworking.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    
}

Get IP address of a host using InetAddress.getByName() and getAllByName()

using InetAddress.getByName() and getAllByName()
using InetAddress.getByName() and getAllByName()

package javaexnetworking;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaExNetworking {
    
    public static void main(String[] args) {
        
        String host = "www.google.com";
        
        System.out.println("by InetAddress.getByName(host):");
        try {
            InetAddress inetAddress = InetAddress.getByName(host);
            System.out.println(inetAddress.toString());
        } catch (UnknownHostException ex) {
            Logger.getLogger(JavaExNetworking.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        System.out.println("\nby InetAddress.getAllByName(host):");
        try {
            InetAddress[] allInetAddress = InetAddress.getAllByName(host);
            for(int i=0; i<allInetAddress.length; i++){
                System.out.println(allInetAddress[i].toString());
            }
        } catch (UnknownHostException ex) {
            Logger.getLogger(JavaExNetworking.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
}