import java.awt.event.*;
import java.util.*;
import java.awt.*;
import java.io.*;
import java.net.*;
/**
*
* CommServer
*
* Generic Flash Communication Server. All communications sent and received
* are (must be) terminated with a null character ('\0') consistent with
* the way Flash does socket communications. Any client which uses this
* protocol should also work.
*
* The server accepts messages from connected clients and broadcasts (verbatim)
* those messages to all connected clients. When clients connect or disconnect
* the server also broadcasts the number of clients via a NUMCLIENTS tag.
*
* Usage: java CommServer [port]
*
* @author Derek Clayton derek_clayton@iceinc.com
* @version 1.0.1
*/
public class CommServer {
private Vector clients = new Vector(); // a list of all connected clients
ServerSocket server; // the server
/**
* Constructor for the CommServer. Begins the start server process.
* @param port Port number the server should listen to for connections.
*/
public CommServer(int port) {
startServer(port);
}
/**
* Starts the server and listens for connections.
* @param port Port number the server should listen to for connections.
*/
private void startServer(int port) {
writeActivity("Attempting to Start Server");
try {
// --- create a new server
server = new ServerSocket(port);
writeActivity("Server Started on Port: " + port);
// --- while the server is active...
while(true) {
// --- ...listen for new client connections
Socket socket = server.accept();
CSClient client = new CSClient(this, socket);
// --- writeActivity(client.getIP() + " connected to the server.");
writeActivity("This should send the client IP:" + client.getIP());
broadcastMessage("" + client.getIP()
+ "");
// --- add the new client to our client list
clients.addElement(client);
// --- start the client thread
client.start();
// --- broadcast the new number of clients
// ---broadcastMessage("" + clients.size()
// --- + "");
}
} catch(IOException ioe) {
writeActivity("Server Error...Stopping Server");
// kill this server
killServer();
}
}
/**
* Broadcasts a message too all connected clients. Messages are terminated
* with a null character.
* @param message The message to broadcast.
*/
public synchronized void broadcastMessage(String message) {
// --- add the null character to the message
message += '\0';
// --- enumerate through the clients and send each the message
Enumeration enumer = clients.elements();
while (enumer.hasMoreElements()) {
CSClient client = (CSClient)enumer.nextElement();
if(true){
client.send(message);
}
writeActivity("" + client.getIP() + "");
// --- remove the client from the list
clients.removeElement(client);
// --- broadcast the new number of clients
broadcastMessage("" + clients.size() + "");
}
/**
* Writes a message to System.out.println in the format
* [mm/dd/yy hh:mm:ss] message.
* @param activity The message.
*/
public void writeActivity(String activity) {
// --- get the current date and time
Calendar cal = Calendar.getInstance();
activity = "[" + cal.get(Calendar.MONTH)
+ "/" + cal.get(Calendar.DAY_OF_MONTH)
+ "/" + cal.get(Calendar.YEAR)
+ " "
+ cal.get(Calendar.HOUR_OF_DAY)
+ ":" + cal.get(Calendar.MINUTE)
+ ":" + cal.get(Calendar.SECOND)
+ "] " + activity + "\n";
// --- display the activity
System.out.print(activity);
}
/**
* Stops the server.
*/
private void killServer() {
try {
// --- stop the server
server.close();
writeActivity("Server Stopped");
} catch (IOException ioe) {
writeActivity("Error while stopping Server");
}
}
public static void main(String args[]) {
CommServer myCS = new CommServer(1338);
}
}