Skip to content

Instantly share code, notes, and snippets.

@sshine
Created November 15, 2011 17:25
Show Gist options
  • Save sshine/1367693 to your computer and use it in GitHub Desktop.
Save sshine/1367693 to your computer and use it in GitHub Desktop.
Java: A modification of KKMultiServer
package multiserver;
import java.net.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class MultiServer {
protected ServerSocket serverSocket = null;
protected boolean listening = true;
protected List<Socket> clientSockets;
public MultiServer(int port) throws IOException {
serverSocket = new ServerSocket(4444);
clientSockets = new ArrayList<Socket>();
while (listening) {
Socket clientSocket = serverSocket.accept();
clientSockets.add(clientSocket);
Thread clientThread = new MultiServerThread(clientSocket, this);
}
serverSocket.close();
}
public void broadcast(String outputLine) {
for (Socket socket : clientSockets) {
PrintWriter out;
try {
out = new PrintWriter(socket.getOutputStream(), true);
out.println(outputLine);
} catch (IOException e) {
// We failed at writing to the socket...
// e.printStackTrace();
removeSocket(socket);
}
}
}
public void removeSocket(Socket socket) {
/* This is the part where socket is removed from clientSockets,
* which is not an entirely trivial part of code since there may
* be several threads that iterate through it and try to remove
* (possibly even the same) sockets at the same time.
*/
clientSockets.remove(socket); // BAD! This is a shared resource.
}
public static void main(String[] args) throws IOException {
new MultiServer(4444);
}
}
package multiserver;
import java.net.*;
import java.io.*;
public class MultiServerThread extends Thread {
private Socket socket = null;
private MultiServer server;
public MultiServerThread(Socket socket, MultiServer server) {
super("MultiServerThread");
this.socket = socket;
this.server = server;
}
public void run() {
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String inputLine, outputLine;
while ((inputLine = in.readLine()) != null) {
outputLine = inputLine; // Maybe do some processing here
// out.println(outputLine); // Don't just send to socket...
server.broadcast(outputLine); // Broadcast it!
if (outputLine.equals("Bye"))
break;
}
out.close();
in.close();
socket.close();
server.removeSocket(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment