Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.net.*;
- import java.io.*;
- import java.util.*;
- public class IterativeChatServer {
- private ArrayList<ChatClientRecord> groupList;
- private class RegFailureException extends Exception { }
- private class ClientWatchdog extends Thread {
- public void run() {
- System.out.println("Client watchdog started");
- // Cleanup old clients
- while (true) {
- int size = groupList.size();
- for (int i = 0; i < size; i++) {
- ChatClientRecord rec = groupList.get(i);
- long currentTime = System.currentTimeMillis();
- if (currentTime - rec.lastHeartbeat > 30*1000) {
- System.out.println("Removing idle client " + rec.name);
- groupList.remove(i);
- break;
- }
- }
- }
- }
- }
- public IterativeChatServer(int serverPort) {
- // Keep a record of available clients
- groupList = new ArrayList<ChatClientRecord>();
- // Start up server
- ServerSocket serverSocket = null;
- try {
- serverSocket = new ServerSocket(serverPort);
- System.out.println("IterativeChatServer started on port " + serverPort);
- } catch (IOException e) {
- System.err.println("Could not listen on port: " + serverPort);
- System.exit(1);
- }
- // Start idle client cleanup
- ClientWatchdog watch = new ClientWatchdog();
- watch.start();
- // Accept chat client connections
- while (true) {
- // Accept a new connection
- Socket clientSocket = null;
- try {
- clientSocket = serverSocket.accept();
- System.out.println("Accepted connection from "
- + clientSocket.getInetAddress().getHostName()
- + ":" + clientSocket.getPort());
- ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
- ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
- ChatMessage request = (ChatMessage)in.readObject();
- if (request.type == ChatMessage.MessageType.REG_ATTEMPT) {
- // Attempt to register client
- String regName = request.payload;
- try {
- for (ChatClientRecord record : groupList)
- if (record.name.equals(regName))
- throw new RegFailureException();
- ChatClientRecord rec = new ChatClientRecord(regName,
- clientSocket.getInetAddress().getHostAddress(),
- clientSocket.getPort());
- rec.lastHeartbeat = System.currentTimeMillis();
- groupList.add(rec);
- ChatMessage msg = new ChatMessage(ChatMessage.MessageType.REG_SUCCESS, null, null);
- out.writeObject(msg);
- } catch (RegFailureException e) {
- System.out.println("A client with name " + regName + " already exists.");
- ChatMessage msg = new ChatMessage(ChatMessage.MessageType.REG_FAIL, null, null);
- out.writeObject(msg);
- }
- } else if (request.type == ChatMessage.MessageType.HEARTBEAT) {
- // Update last heartbeat time to current time
- String name = request.payload;
- for (ChatClientRecord rec : groupList)
- if (rec.name.equals(name))
- rec.lastHeartbeat = System.currentTimeMillis();
- } else if (request.type == ChatMessage.MessageType.GET_LIST) {
- // Send group list back to client
- ChatMessage msg = new ChatMessage(ChatMessage.MessageType.GET_LIST, null, groupList);
- out.writeObject(msg);
- }
- clientSocket.close();
- } catch (ClassNotFoundException e) {
- System.err.println("Could not find class ChatMessage");
- System.exit(1);
- } catch (IOException e) {
- System.err.println("Accept failed (IOException)");
- }
- }
- }
- public static void main(String[] args) {
- int serverPort;
- if (args.length == 1) {
- serverPort = Integer.parseInt(args[0]);
- new IterativeChatServer(serverPort);
- }
- }
- }
Add Comment
Please, Sign In to add comment