Java Networking: Develop Cross-Device Applications with Ease

Explore Java networking, a key aspect of creating programs that operate across multiple devices connected via a network. Learn how to leverage Java's networking capabilities to build applications that communicate and share data over the internet or local networks.



Java Networking

Java networking (or Java network programming) refers to writing programs that execute across multiple devices (computers), where the devices are all connected to each other using a network.

Advantages of Java Networking

  • Creating server-client applications
  • Implementing networking protocols
  • Implementing socket programming
  • Creating web services

Packages Used in Networking

The java.net package of the J2SE APIs contains classes and interfaces that provide low-level communication details, allowing programs to focus on solving the problem at hand.

Socket Programming in Java Networking

Sockets provide the communication mechanism between two computers using TCP (Transmission Control Protocol). Here’s how socket programming works in Java:

Server-Side Socket Programming

On the server side, the following steps occur:

  1. The server instantiates a ServerSocket object, specifying the port number.
  2. The server invokes the accept() method of the ServerSocket class, which waits for a client connection.
  3. After a client connects, a new Socket object is created on the server, connected to the client’s socket.
  4. Communication occurs using I/O streams (both input and output).

Client-Side Socket Programming

On the client side:

  1. The client creates a Socket object, specifying the server name and port number.
  2. The client connects to the server using the connect() method of the Socket class.
  3. Communication occurs similarly via I/O streams.

Example of Java Networking

Implementing Socket Client in Java

GreetingClient.java

import java.net.*;
import java.io.*;

public class GreetingClient {

    public static void main(String [] args) {
    String serverName = args[0];
    int port = Integer.parseInt(args[1]);
    try {
        System.out.println("Connecting to " + serverName + " on port " + port);
        Socket client = new Socket(serverName, port);
        
        System.out.println("Just connected to " + client.getRemoteSocketAddress());
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);
        
        out.writeUTF("Hello from " + client.getLocalSocketAddress());
        InputStream inFromServer = client.getInputStream();
        DataInputStream in = new DataInputStream(inFromServer);
        
        System.out.println("Server says " + in.readUTF());
        client.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}
    

Implementing Socket Server in Java

GreetingServer.java

import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
    private ServerSocket serverSocket;
    
    public GreetingServer(int port) throws IOException {
    serverSocket = new ServerSocket(port);
    serverSocket.setSoTimeout(10000);
    }

    public void run() {
    while(true) {
        try {
            System.out.println("Waiting for client on port " + 
                serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
                + "\nGoodbye!");
            server.close();
            
        } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
        } catch (IOException e) {
            e.printStackTrace();
            break;
        }
    }
    }
    
    public static void main(String [] args) {
    int port = Integer.parseInt(args[0]);
    try {
        Thread t = new GreetingServer(port);
        t.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}