Guest User

Untitled

a guest
Oct 24th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. import java.net.*;
  2. import java.io.*;
  3. import java.util.*;
  4.  
  5. public class IterativeChatServer {
  6. private ArrayList<ChatClientRecord> groupList;
  7.  
  8. private class RegFailureException extends Exception { }
  9.  
  10. private class ClientWatchdog extends Thread {
  11. public void run() {
  12. System.out.println("Client watchdog started");
  13. // Cleanup old clients
  14. while (true) {
  15. int size = groupList.size();
  16. for (int i = 0; i < size; i++) {
  17. ChatClientRecord rec = groupList.get(i);
  18. long currentTime = System.currentTimeMillis();
  19. if (currentTime - rec.lastHeartbeat > 30*1000) {
  20. System.out.println("Removing idle client " + rec.name);
  21. groupList.remove(i);
  22. break;
  23. }
  24. }
  25. }
  26. }
  27. }
  28.  
  29. public IterativeChatServer(int serverPort) {
  30. // Keep a record of available clients
  31. groupList = new ArrayList<ChatClientRecord>();
  32.  
  33. // Start up server
  34. ServerSocket serverSocket = null;
  35. try {
  36. serverSocket = new ServerSocket(serverPort);
  37. System.out.println("IterativeChatServer started on port " + serverPort);
  38. } catch (IOException e) {
  39. System.err.println("Could not listen on port: " + serverPort);
  40. System.exit(1);
  41. }
  42.  
  43. // Start idle client cleanup
  44. ClientWatchdog watch = new ClientWatchdog();
  45. watch.start();
  46.  
  47. // Accept chat client connections
  48. while (true) {
  49. // Accept a new connection
  50. Socket clientSocket = null;
  51. try {
  52. clientSocket = serverSocket.accept();
  53. System.out.println("Accepted connection from "
  54. + clientSocket.getInetAddress().getHostName()
  55. + ":" + clientSocket.getPort());
  56. ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
  57. ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
  58. ChatMessage request = (ChatMessage)in.readObject();
  59.  
  60. if (request.type == ChatMessage.MessageType.REG_ATTEMPT) {
  61. // Attempt to register client
  62. String regName = request.payload;
  63. try {
  64. for (ChatClientRecord record : groupList)
  65. if (record.name.equals(regName))
  66. throw new RegFailureException();
  67. ChatClientRecord rec = new ChatClientRecord(regName,
  68. clientSocket.getInetAddress().getHostAddress(),
  69. clientSocket.getPort());
  70. rec.lastHeartbeat = System.currentTimeMillis();
  71. groupList.add(rec);
  72. ChatMessage msg = new ChatMessage(ChatMessage.MessageType.REG_SUCCESS, null, null);
  73. out.writeObject(msg);
  74. } catch (RegFailureException e) {
  75. System.out.println("A client with name " + regName + " already exists.");
  76. ChatMessage msg = new ChatMessage(ChatMessage.MessageType.REG_FAIL, null, null);
  77. out.writeObject(msg);
  78. }
  79. } else if (request.type == ChatMessage.MessageType.HEARTBEAT) {
  80. // Update last heartbeat time to current time
  81. String name = request.payload;
  82. for (ChatClientRecord rec : groupList)
  83. if (rec.name.equals(name))
  84. rec.lastHeartbeat = System.currentTimeMillis();
  85. } else if (request.type == ChatMessage.MessageType.GET_LIST) {
  86. // Send group list back to client
  87. ChatMessage msg = new ChatMessage(ChatMessage.MessageType.GET_LIST, null, groupList);
  88. out.writeObject(msg);
  89. }
  90.  
  91. clientSocket.close();
  92. } catch (ClassNotFoundException e) {
  93. System.err.println("Could not find class ChatMessage");
  94. System.exit(1);
  95. } catch (IOException e) {
  96. System.err.println("Accept failed (IOException)");
  97. }
  98. }
  99. }
  100.  
  101. public static void main(String[] args) {
  102. int serverPort;
  103. if (args.length == 1) {
  104. serverPort = Integer.parseInt(args[0]);
  105. new IterativeChatServer(serverPort);
  106. }
  107. }
  108. }
Add Comment
Please, Sign In to add comment