Skip to content

Instantly share code, notes, and snippets.

@declank
Created December 17, 2014 15:07
Show Gist options
  • Save declank/8fce5a02e4b6bb572e7a to your computer and use it in GitHub Desktop.
Save declank/8fce5a02e4b6bb572e7a to your computer and use it in GitHub Desktop.
[Java] Simple multi-threaded ServerSocket implementation.
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server implements Runnable {
private volatile boolean isStopped;
private ServerSocket serverSocket;
private final ExecutorService threadPool = Executors.newCachedThreadPool();
@Override
public void run() {
try {
serverSocket = new ServerSocket(9000);
serverSocket.setSoTimeout(0);
} catch (IOException ex) {
throw new RuntimeException("Unable to open ServerSocket: " + ex.getMessage());
}
// Run server socket handler in separate thread so accept doesn't block stop
Thread serverSocketHandler = new Thread(new Runnable() {
@Override
public void run() {
Socket clientSocket;
int clientNumber = 1;
while(!isStopped) {
try {
System.out.println("Waiting for connections...");
clientSocket = serverSocket.accept();
threadPool.execute(new ClientHandler(clientSocket, clientNumber++));
} catch (IOException ex) {
errorLog(ex.getMessage());
}
}
}
});
serverSocketHandler.start();
}
private class ClientHandler implements Runnable {
@Override
public void run() {
System.out.println("Handling client (" + clientNumber + "): " + socket.toString());
try {
socket.close();
} catch(IOException ex) {
errorLog(ex.getMessage());
}
}
public ClientHandler(Socket socket, int clientNumber) {
this.socket = socket;
this.clientNumber = clientNumber;
}
private final Socket socket;
private final int clientNumber;
}
public synchronized void stop() throws IOException {
System.out.println("Stopping server...");
isStopped = true;
if(serverSocket != null)
serverSocket.close();
threadPool.shutdown();
}
private void errorLog(String message) {
System.err.println("ERROR: " + message);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment