Java Sockets

TCP communication endpoints in Java

🔌 What are Java Sockets?

Sockets are endpoints for network communication in Java. They enable TCP connections between client and server applications, providing reliable data transmission over networks with built-in error handling.


// Basic socket connection
Socket socket = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello Server!");
socket.close();
                                    

Types of Sockets

📱

Client Socket

Connects to server applications

Socket client = new Socket("host", port);
🖥️

Server Socket

Listens for client connections

ServerSocket server = new ServerSocket(port);
📤

Output Stream

Sends data through socket

PrintWriter out = new PrintWriter(socket.getOutputStream());
📥

Input Stream

Receives data from socket

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

🔹 Simple Client Socket

Create a client that connects to a server:

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

public class SimpleClient {
    public static void main(String[] args) {
        try {
            // Connect to server on localhost port 8080
            Socket socket = new Socket("localhost", 8080);
            
            // Create output stream to send data
            PrintWriter out = new PrintWriter(
                socket.getOutputStream(), true);
            
            // Send message to server
            out.println("Hello from client!");
            
            // Create input stream to receive data
            BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
            
            // Read response from server
            String response = in.readLine();
            System.out.println("Server says: " + response);
            
            // Close connection
            socket.close();
            
        } catch (IOException e) {
            System.out.println("Client error: " + e.getMessage());
        }
    }
}

🔹 Simple Server Socket

Create a server that accepts client connections:

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

public class SimpleServer {
    public static void main(String[] args) {
        try {
            // Create server socket on port 8080
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Server started on port 8080");
            
            // Wait for client connection
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected!");
            
            // Create input stream to receive data
            BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));
            
            // Create output stream to send data
            PrintWriter out = new PrintWriter(
                clientSocket.getOutputStream(), true);
            
            // Read message from client
            String message = in.readLine();
            System.out.println("Client says: " + message);
            
            // Send response to client
            out.println("Hello from server!");
            
            // Close connections
            clientSocket.close();
            serverSocket.close();
            
        } catch (IOException e) {
            System.out.println("Server error: " + e.getMessage());
        }
    }
}

Server Output:

Server started on port 8080

Client connected!

Client says: Hello from client!

🔹 Socket Methods

Important methods for working with sockets:

Socket Class Methods:

  • getInputStream(): Get input stream for reading data
  • getOutputStream(): Get output stream for writing data
  • isConnected(): Check if socket is connected
  • isClosed(): Check if socket is closed
  • close(): Close the socket connection

ServerSocket Class Methods:

  • accept(): Wait for and accept client connection
  • getLocalPort(): Get the port server is listening on
  • isClosed(): Check if server socket is closed
  • close(): Close the server socket

🔹 Multi-threaded Server

Handle multiple clients simultaneously:

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

public class MultiThreadServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Multi-threaded server started");
            
            while (true) {
                // Accept client connection
                Socket clientSocket = serverSocket.accept();
                
                // Create new thread for each client
                Thread clientThread = new Thread(() -> {
                    handleClient(clientSocket);
                });
                clientThread.start();
            }
        } catch (IOException e) {
            System.out.println("Server error: " + e.getMessage());
        }
    }
    
    private static void handleClient(Socket clientSocket) {
        try {
            BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(
                clientSocket.getOutputStream(), true);
            
            String message = in.readLine();
            System.out.println("Received: " + message);
            out.println("Echo: " + message);
            
            clientSocket.close();
        } catch (IOException e) {
            System.out.println("Client handling error: " + e.getMessage());
        }
    }
}

🧠 Test Your Knowledge

Which method is used to wait for client connections in ServerSocket?