Отправить байты с помощью Jade ACLMessage в Java

Я пытаюсь отправить массив байтов с сообщением Jade ACL. По сути, я хочу сделать то, что делает этот парень: плохое дополнение ошибки расшифровки, но я не Не нужно преобразовывать шифр в строку, а отправлять байты напрямую. Есть функция с именем setByteSequence, которую я мог бы/должен использовать, но когда я запускаю свой код, он выдает ошибку о том, что base64 не поддерживается, и ссылается на документацию, в которой ничего не говорится о том, как ее использовать. Только то, что он поддерживается. Я использую jade.jar с веб-сайта Jade.

Отправитель:

public class Alice extends Agent {
private static final long serialVersionUID = 725326296709140752L;

protected void setup() {  
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);

AID recipient1 = new AID();
recipient1.setName(String.format("Bob@%s:1099/JADE", Main.IPBob));
recipient1.addAddresses(String.format("http://%s:7778/acc", Main.IPBob));

msg.addReceiver(recipient1);
//  byte[] mBytes = "bla".getBytes(); // this doesn't work
byte[] mBytes = Base64.getEncoder().encode("bla".getBytes()); // neither does this
msg.setByteSequenceContent(mBytes);
send(msg);
     }
}

Получатель:

public class Bob extends Agent {
private static final long serialVersionUID = 2028682217881039710L;

protected void setup() {
    addBehaviour(new CyclicBehaviour(this) {

        private static final long serialVersionUID = 1L;

        public void action() {
            ACLMessage msg = myAgent.receive();

            if (msg != null) {
                System.out.println(String.format("Got Message %s", DatatypeConverter.printBase64Binary(msg.getByteSequenceContent())));
            } else {
                block();
            }
        }
    });
    }
}

Главный:

public class Main {
public static final String IPAlice = "...";
public static final String IPBob = "...";

public static void main(String[] args) {
    int port = 1099;
    int mtpPort = 7778;
    String hostIP = "...";
    Profile profile = new ProfileImpl(hostIP, port, null, true);
    profile.setParameter(Profile.MTPS, "jade.mtp.http.MessageTransportProtocol(http://"+hostIP+":"+mtpPort+"/acc)");

    Runtime runtime = Runtime.instance();

    AgentContainer container = runtime.createMainContainer(profile);
    try {
//          AgentController bob = container.createNewAgent("Bob", agent.Bob.class.getName(), null);
//          bob.start();

        AgentController alice = container.createNewAgent("Alice", agent.Alice.class.getName(), null);
        alice.start();


    } catch (StaleProxyException e) {
        e.printStackTrace();
    }
}
}
}

Пример base64 тоже ничего не показывает. Он просто устанавливает объект в качестве содержимого сообщения и говорит, что он будет закодирован в base64... Может быть, я упускаю очевидное, но я этого не вижу. Я благодарен за помощь.


person Rick    schedule 17.01.2017    source источник


Ответы (2)


Попробовал его с источниками вместо jar и обнаружил, что org.apache.commons.codec.binary.Base64 не может быть разрешен, что означает, что я должен добавить Кодек Apache Commons в мой проект.

person Rick    schedule 19.01.2017

Вот как должен выглядеть ваш агент-отправитель.

////////////////////////////////// ОТПРАВИТЕЛЬ ///////////////// ///////////////

                  Path path = Paths.get("Address of file");

                    byte[] data = null;                         
                    try {
                        data = Files.readAllBytes(path);
                    } catch (IOException ex) {
                        Logger.getLogger(DataAgent.class.getName()).log(Level.SEVERE, null, ex);
                    }

ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.addReceiver(<receiver-aid>);
msg.addReceiver(new AID("Agent-name", AID.ISLOCALNAME));

msg.setByteSequenceContent(data);
msg.addUserDefinedParameter("file-name", filename);
send(msg);
 System.out.println("Message sent"); 

Вот как должен выглядеть ваш агент-получатель:

////////////////////// ПОЛУЧАТЕЛЬ //////////////////////

ACLMessage msg = receive();

System.out.println("Received msg is "+msg.getContent());

String fileName = msg.getUserDefinedParameter("file-name");
File f = new File(fileName);

byte[] fileContent = msg.getByteSequenceContent();

//write to file
person Piyush Rumao    schedule 30.03.2017