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());
}
}
}