123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- package mdd.client;
- import javafx.application.Platform;
- import javafx.concurrent.Service;
- import javafx.concurrent.Task;
- import org.json.simple.JSONArray;
- import org.json.simple.JSONObject;
- import org.json.simple.parser.JSONParser;
- import org.json.simple.parser.ParseException;
- import org.zeromq.SocketType;
- import org.zeromq.ZMQ;
- import org.zeromq.ZContext;
- import java.util.concurrent.CountDownLatch;
- public class Client implements IGUIEventClient
- {
- private ZContext context;
- private ZMQ.Socket req_socket;
- private ZMQ.Socket sub_socket;
- private long server_id = 0;
- private long msg_counter = 0;
- private Thread listenerThread;
- private GUIEventHandler _eventHandler;
- static Client client = new Client();
- public void request_state(){
- JSONObject json = new JSONObject();
- json.put("operation", "state");
- json.put("args", "all");
- JSONObject jmsg = request("get",json);
- server_id = (long)jmsg.get("serverID");
- msg_counter = (long) jmsg.get("msgNr");
- if (jmsg.containsKey("receive"))
- {
- JSONObject jstate = (JSONObject)jmsg.get("receive");
- System.out.println("[Client]: state: " + jstate.toString());
- _eventHandler.publishEvent("load", (JSONObject)jstate.get("args"));
- }
- //System.out.println("State : " + jmsg.toString());
- }
- private void processChangeResponse(JSONObject jchange){
- String soper = (String)jchange.get("operation");
- if (soper.equals("change")){
- JSONObject jargs = (JSONObject) jchange.get("args");
- if (jargs != null){
- JSONObject jobj = (JSONObject) jargs.get("object");
- if (jobj != null){
- if (jobj.containsKey("GUI")){
- _eventHandler.publishEvent(5,"change", jchange);
- return;
- }
- }
- }
- }
- _eventHandler.publishEvent("change", jchange);
- }
- private void listen(){
- while (!Thread.currentThread().isInterrupted()) {
- // Read envelope with address
- String address = sub_socket.recvStr();
- // Read message contents
- String content = sub_socket.recvStr();
- JSONParser jsonParser = new JSONParser();
- JSONObject jmsg = null;
- try {
- jmsg = (JSONObject) jsonParser.parse(content);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- if ((long) jmsg.get("serverID") == server_id){
- if ((long) jmsg.get("msgNr") == msg_counter) {
- //<--close Thread
- JSONObject finalJmsg = jmsg;
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- if (finalJmsg.get("change") instanceof JSONArray){
- JSONArray jarray = (JSONArray) finalJmsg.get("change");
- for(int i = 0; i < jarray.size(); ++i){
- processChangeResponse((JSONObject)jarray.get(i));
- }
- }else{
- JSONObject jchange = (JSONObject) finalJmsg.get("change");
- processChangeResponse(jchange);
- }
- }
- });
- //<--reopen Thread
- } else {
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- request_state();
- }
- });
- }
- }
- System.out.println("[Client]: listen: " + address + " : " + content);//Todo
- ++msg_counter;
- }
- }
- public Client(){
- _eventHandler = GUIEventHandler.getEventHandler();
- _eventHandler.addEventListener(this, 10);
- try{
- context = new ZContext();
- req_socket = context.createSocket(SocketType.REQ);
- req_socket.connect("tcp://localhost:5555");
- sub_socket = context.createSocket(SocketType.SUB);
- sub_socket.connect("tcp://localhost:5556");
- sub_socket.subscribe("CHANGE".getBytes(ZMQ.CHARSET));
- } catch (Exception e) {
- e.printStackTrace();
- }
- request_state();
- Runnable runnable = this::listen;
- listenerThread = new Thread(runnable);
- listenerThread.start();
- }
- public JSONObject request(JSONObject json){
- req_socket.send(json.toString().getBytes(ZMQ.CHARSET), 0);
- String reply = req_socket.recvStr(0);
- JSONParser jsonParser = new JSONParser();
- JSONObject jmsg = null;
- try {
- jmsg = (JSONObject) jsonParser.parse(reply);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- //System.out.println("[Client]: request: "+ jmsg.toString());
- return jmsg;
- }
- public JSONObject request(String flag, JSONObject json){
- JSONObject jmsg = new JSONObject();
- jmsg.put("serverID", server_id);
- jmsg.put("msgNr", msg_counter);
- jmsg.put("protocol", "0.1");
- JSONArray jcontext = new JSONArray();
- JSONObject jelem = new JSONObject();
- jelem.put(flag, json);
- jcontext.add(jelem);
- jmsg.put("context", jcontext);
- return request(jmsg);
- }
- @Override
- public void processGUIEvent(String event, JSONObject args) {
- if (event.equals("try")){
- JSONObject jans = request("try",args);
- }
- if (event.equals("get")){
- JSONObject jans = request("get", args);
- _eventHandler.publishEvent("receive", (JSONObject)jans.get("receive"));
- }
- }
- @Override
- public void close() throws Exception {
- listenerThread.join();
- //close Server
- _eventHandler.removeEventListener(this);
- }
- public long getID(){return server_id;}
- }
|