Client.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package mdd.client;
  2. import javafx.application.Platform;
  3. import javafx.concurrent.Service;
  4. import javafx.concurrent.Task;
  5. import org.json.simple.JSONArray;
  6. import org.json.simple.JSONObject;
  7. import org.json.simple.parser.JSONParser;
  8. import org.json.simple.parser.ParseException;
  9. import org.zeromq.SocketType;
  10. import org.zeromq.ZMQ;
  11. import org.zeromq.ZContext;
  12. import java.util.concurrent.CountDownLatch;
  13. public class Client implements IGUIEventClient
  14. {
  15. private ZContext context;
  16. private ZMQ.Socket req_socket;
  17. private ZMQ.Socket sub_socket;
  18. private long server_id = 0;
  19. private long msg_counter = 0;
  20. private Thread listenerThread;
  21. private GUIEventHandler _eventHandler;
  22. static Client client = new Client();
  23. public void request_state(){
  24. JSONObject json = new JSONObject();
  25. json.put("operation", "state");
  26. json.put("args", "all");
  27. JSONObject jmsg = request("get",json);
  28. server_id = (long)jmsg.get("serverID");
  29. msg_counter = (long) jmsg.get("msgNr");
  30. if (jmsg.containsKey("receive"))
  31. {
  32. JSONObject jstate = (JSONObject)jmsg.get("receive");
  33. System.out.println("[Client]: state: " + jstate.toString());
  34. _eventHandler.publishEvent("load", (JSONObject)jstate.get("args"));
  35. }
  36. //System.out.println("State : " + jmsg.toString());
  37. }
  38. private void processChangeResponse(JSONObject jchange){
  39. String soper = (String)jchange.get("operation");
  40. if (soper.equals("change")){
  41. JSONObject jargs = (JSONObject) jchange.get("args");
  42. if (jargs != null){
  43. JSONObject jobj = (JSONObject) jargs.get("object");
  44. if (jobj != null){
  45. if (jobj.containsKey("GUI")){
  46. _eventHandler.publishEvent(5,"change", jchange);
  47. return;
  48. }
  49. }
  50. }
  51. }
  52. _eventHandler.publishEvent("change", jchange);
  53. }
  54. private void listen(){
  55. while (!Thread.currentThread().isInterrupted()) {
  56. // Read envelope with address
  57. String address = sub_socket.recvStr();
  58. // Read message contents
  59. String content = sub_socket.recvStr();
  60. JSONParser jsonParser = new JSONParser();
  61. JSONObject jmsg = null;
  62. try {
  63. jmsg = (JSONObject) jsonParser.parse(content);
  64. } catch (ParseException e) {
  65. e.printStackTrace();
  66. }
  67. if ((long) jmsg.get("serverID") == server_id){
  68. if ((long) jmsg.get("msgNr") == msg_counter) {
  69. //<--close Thread
  70. JSONObject finalJmsg = jmsg;
  71. Platform.runLater(new Runnable() {
  72. @Override
  73. public void run() {
  74. if (finalJmsg.get("change") instanceof JSONArray){
  75. JSONArray jarray = (JSONArray) finalJmsg.get("change");
  76. for(int i = 0; i < jarray.size(); ++i){
  77. processChangeResponse((JSONObject)jarray.get(i));
  78. }
  79. }else{
  80. JSONObject jchange = (JSONObject) finalJmsg.get("change");
  81. processChangeResponse(jchange);
  82. }
  83. }
  84. });
  85. //<--reopen Thread
  86. } else {
  87. Platform.runLater(new Runnable() {
  88. @Override
  89. public void run() {
  90. request_state();
  91. }
  92. });
  93. }
  94. }
  95. System.out.println("[Client]: listen: " + address + " : " + content);//Todo
  96. ++msg_counter;
  97. }
  98. }
  99. public Client(){
  100. _eventHandler = GUIEventHandler.getEventHandler();
  101. _eventHandler.addEventListener(this, 10);
  102. try{
  103. context = new ZContext();
  104. req_socket = context.createSocket(SocketType.REQ);
  105. req_socket.connect("tcp://localhost:5555");
  106. sub_socket = context.createSocket(SocketType.SUB);
  107. sub_socket.connect("tcp://localhost:5556");
  108. sub_socket.subscribe("CHANGE".getBytes(ZMQ.CHARSET));
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. }
  112. request_state();
  113. Runnable runnable = this::listen;
  114. listenerThread = new Thread(runnable);
  115. listenerThread.start();
  116. }
  117. public JSONObject request(JSONObject json){
  118. req_socket.send(json.toString().getBytes(ZMQ.CHARSET), 0);
  119. String reply = req_socket.recvStr(0);
  120. JSONParser jsonParser = new JSONParser();
  121. JSONObject jmsg = null;
  122. try {
  123. jmsg = (JSONObject) jsonParser.parse(reply);
  124. } catch (ParseException e) {
  125. e.printStackTrace();
  126. }
  127. //System.out.println("[Client]: request: "+ jmsg.toString());
  128. return jmsg;
  129. }
  130. public JSONObject request(String flag, JSONObject json){
  131. JSONObject jmsg = new JSONObject();
  132. jmsg.put("serverID", server_id);
  133. jmsg.put("msgNr", msg_counter);
  134. jmsg.put("protocol", "0.1");
  135. JSONArray jcontext = new JSONArray();
  136. JSONObject jelem = new JSONObject();
  137. jelem.put(flag, json);
  138. jcontext.add(jelem);
  139. jmsg.put("context", jcontext);
  140. return request(jmsg);
  141. }
  142. @Override
  143. public void processGUIEvent(String event, JSONObject args) {
  144. if (event.equals("try")){
  145. JSONObject jans = request("try",args);
  146. }
  147. if (event.equals("get")){
  148. JSONObject jans = request("get", args);
  149. _eventHandler.publishEvent("receive", (JSONObject)jans.get("receive"));
  150. }
  151. }
  152. @Override
  153. public void close() throws Exception {
  154. listenerThread.join();
  155. //close Server
  156. _eventHandler.removeEventListener(this);
  157. }
  158. public long getID(){return server_id;}
  159. }