Created
December 17, 2014 15:07
-
-
Save declank/8fce5a02e4b6bb572e7a to your computer and use it in GitHub Desktop.
[Java] Simple multi-threaded ServerSocket implementation.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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