Created
November 15, 2011 17:25
-
-
Save sshine/1367693 to your computer and use it in GitHub Desktop.
Java: A modification of KKMultiServer
This file contains hidden or 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
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); | |
} | |
} |
This file contains hidden or 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
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