Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. package Server;
  2.  
  3. import Model.Messages.Message;
  4. import Model.Network.Token;
  5. import Model.Network.UserSession;
  6.  
  7. import java.util.*;
  8.  
  9. import Utils.*;
  10. import Config.*;
  11.  
  12. /**
  13. * Class NetworkScheduler will send Messages to the connected clients based on
  14. * what those messages are (it will pack them into json strings) and based on
  15. * if enough time has passed since the last dispatched set of messages, simply call
  16. * send(Message m) and it will be done
  17. */
  18. public class NetworkScheduler {
  19. private List<Message> openMessages;
  20. private Map<Token, Long> lastSentAt;
  21. private GameServer gameServer;
  22.  
  23. public NetworkScheduler() {
  24. openMessages = new ArrayList<Message>();
  25. lastSentAt = new HashMap<Token, Long>();
  26. }
  27.  
  28. public void setServer(GameServer server) {
  29. gameServer = server;
  30. }
  31.  
  32. public void send(final Message message) {
  33. System.out.println(message.getSubject());
  34. if(lastSentAt.containsKey(message.getReceptor())) {
  35. // User has been sent messages some time ago
  36. final long oldTimer = lastSentAt.get(message.getReceptor());
  37. final long nowTimer = Utils.calcTime();
  38.  
  39. long gap = nowTimer - oldTimer;
  40. System.out.println("dif: " + gap);
  41. if(gap > Config.MAX_MESSAGES_TIMER) {
  42. // It's ok, enough time has passed, send message and possibly old open messages
  43. UserSession session = gameServer.getConnectedUser(message.getReceptor());
  44.  
  45. // Fix for ConcurrentModificationException
  46. for (Iterator<Message> iterator = openMessages.iterator(); iterator.hasNext();) {
  47. Message m = iterator.next();
  48. if (m.getReceptor().equals(message.getReceptor())) {
  49. // Remove the current element from the iterator and the list.
  50. session.getConnection().send(JSONEncoder.create(m));
  51. iterator.remove();
  52. }
  53. }
  54.  
  55. session.getConnection().send(JSONEncoder.create(message));
  56. lastSentAt.put(message.getReceptor(), nowTimer);
  57. Logger.logDebug("Message(s) to User " + message.getReceptor().toString() + " have been sent at");
  58. }
  59. else {
  60. // Not enough time has passed, add message to queue
  61. openMessages.add(message);
  62. final long timeToWait = Config.MAX_MESSAGES_TIMER - gap;
  63.  
  64. class Sleeper implements Runnable {
  65. @Override
  66. public void run() {
  67. try {
  68. // Let the Thread sleep until the batch can be send
  69. Thread.sleep(timeToWait);
  70. send(message);
  71. }
  72. catch (InterruptedException e) {
  73. Logger.logError("Thread interrupted for User " + message.getReceptor().toString());
  74. }
  75. }
  76. }
  77.  
  78. new Thread(new Sleeper()).start();
  79.  
  80. Logger.logDebug("Message to User " + message.getReceptor().toString() + " needs to wait for " + timeToWait);
  81. }
  82. }
  83. else {
  84. // It seems this user has never been sent something, sent the Message and add him to the lastSentAt
  85. lastSentAt.put(message.getReceptor(), Utils.calcTime());
  86. UserSession session = gameServer.getConnectedUser(message.getReceptor());
  87. session.getConnection().send(JSONEncoder.create(message));
  88. Logger.logDebug("Message to User " + message.getReceptor().toString() + " has been sent");
  89. }
  90. }
  91.  
  92. /**
  93. * deleteFor(Token) will delete all open Messages to this client Token in case
  94. * the client dc'ed or has quit the game etc.
  95. * @param token The token to identify the client
  96. */
  97. public void deleteFor(Token token) {
  98. for(Message m : openMessages) {
  99. if(m.getReceptor().equals(token)) {
  100. openMessages.remove(m);
  101. }
  102. }
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement