JADE 平台通讯
JADE Platform Communication
基本上我正在尝试与这里询问的相同的事情:Passing ACL messages between jade remote platforms
我有两个程序分别创建两个主容器和一个代理。我 运行 两个程序都在不同的机器上运行,并且想从一个代理向另一个代理发送消息。上面链接的问题中建议的答案对我不起作用。接收方总是抛出一个 java.lang.OutOfMemoryError 并且发送方显示:
jade.mtp.MTPException: Description: ResponseMessage is not OK
如果两个代理 运行 在不同机器上的不同代理容器中但在同一主容器中工作,则发送消息,但这不是我试图实现的。
希望你能帮助我。
代码
发件人:
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.instance();
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST, "172.16.200.100");
p.setParameter(Profile.MAIN_PORT, "1337");
p.setParameter(Profile.CONTAINER_NAME,"Reality");
AgentContainer agentContainer = runtime.createMainContainer(p);
try {
AgentController ac = agentContainer.createNewAgent("hitman",Agent47.class.getName(),null);
ac.start();
} catch (StaleProxyException e) {e.printStackTrace();}
}
}
public class Agent47 extends Agent {
private static final long serialVersionUID = 1L;
@Override
protected void setup() {
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
AID dest = new AID("AgentSmith@Matrix",AID.ISGUID);
dest.addAddresses("http://172.16.200.1:4242/acc");
msg.addReceiver(dest);
msg.setContent("Hello!");
send(msg);
}
}
接收方:
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.instance();
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST, "172.16.200.1");
p.setParameter(Profile.MAIN_PORT, "4242");
p.setParameter(Profile.CONTAINER_NAME,"Matrix");
AgentContainer agentContainer = runtime.createMainContainer(p);
try {
AgentController ac = agentContainer.createNewAgent("AgentSmith",AgentSmith.class.getName(),null);
ac.start();
} catch (StaleProxyException e) {e.printStackTrace();}
}
}
public class AgentSmith extends Agent {
private static final long serialVersionUID = 1L;
@Override
protected void setup() {
addBehaviour(new CyclicBehaviour(this){
private static final long serialVersionUID = 1L;
public void action() {
ACLMessage msg = myAgent.receive();
if(msg != null){
String content = msg.getContent();
if (content != null) {
System.out.println("Received Request from "+msg.getSender().getLocalName());
System.out.println("Received Message : "+content);
}
}
}
});
System.out.println("Setup done!");
}
}
解决了一些问题。如果其他人有同样的问题,这里是我的解决方案:
我必须设置平台 IP 以及 MTP 主机的 IP。
String host = "172.16.200.100"; // Platform IP
int port = 1099; // default-port 1099
String MTP_hostIP = "172.16.200.100";
String MTP_Port = "7778";
Runtime runtime = Runtime.instance();
Profile profile = new ProfileImpl(host, port, null, true);
profile.setParameter(Profile.MTPS, "jade.mtp.http.MessageTransportProtocol(http://"+MTP_hostIP+":"+MTP_Port+"/acc)");
// create container
AgentContainer container = runtime.createMainContainer(profile);
try {
AgentController ac = container.createNewAgent("AgentSmith",AgentSmith.class.getName(),null);
ac.start();
} catch (StaleProxyException e) {
e.printStackTrace();
}
还发现,如果我使用 localhost 作为主机 IP,使用 MTP 主机 的网络 IP,通信在我的 class B 网络中无法正常工作。将两个变量设置为相同的 IP 解决了这个问题。
基本上我正在尝试与这里询问的相同的事情:Passing ACL messages between jade remote platforms
我有两个程序分别创建两个主容器和一个代理。我 运行 两个程序都在不同的机器上运行,并且想从一个代理向另一个代理发送消息。上面链接的问题中建议的答案对我不起作用。接收方总是抛出一个 java.lang.OutOfMemoryError 并且发送方显示:
jade.mtp.MTPException: Description: ResponseMessage is not OK
如果两个代理 运行 在不同机器上的不同代理容器中但在同一主容器中工作,则发送消息,但这不是我试图实现的。 希望你能帮助我。
代码
发件人:
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.instance();
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST, "172.16.200.100");
p.setParameter(Profile.MAIN_PORT, "1337");
p.setParameter(Profile.CONTAINER_NAME,"Reality");
AgentContainer agentContainer = runtime.createMainContainer(p);
try {
AgentController ac = agentContainer.createNewAgent("hitman",Agent47.class.getName(),null);
ac.start();
} catch (StaleProxyException e) {e.printStackTrace();}
}
}
public class Agent47 extends Agent {
private static final long serialVersionUID = 1L;
@Override
protected void setup() {
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
AID dest = new AID("AgentSmith@Matrix",AID.ISGUID);
dest.addAddresses("http://172.16.200.1:4242/acc");
msg.addReceiver(dest);
msg.setContent("Hello!");
send(msg);
}
}
接收方:
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.instance();
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST, "172.16.200.1");
p.setParameter(Profile.MAIN_PORT, "4242");
p.setParameter(Profile.CONTAINER_NAME,"Matrix");
AgentContainer agentContainer = runtime.createMainContainer(p);
try {
AgentController ac = agentContainer.createNewAgent("AgentSmith",AgentSmith.class.getName(),null);
ac.start();
} catch (StaleProxyException e) {e.printStackTrace();}
}
}
public class AgentSmith extends Agent {
private static final long serialVersionUID = 1L;
@Override
protected void setup() {
addBehaviour(new CyclicBehaviour(this){
private static final long serialVersionUID = 1L;
public void action() {
ACLMessage msg = myAgent.receive();
if(msg != null){
String content = msg.getContent();
if (content != null) {
System.out.println("Received Request from "+msg.getSender().getLocalName());
System.out.println("Received Message : "+content);
}
}
}
});
System.out.println("Setup done!");
}
}
解决了一些问题。如果其他人有同样的问题,这里是我的解决方案: 我必须设置平台 IP 以及 MTP 主机的 IP。
String host = "172.16.200.100"; // Platform IP
int port = 1099; // default-port 1099
String MTP_hostIP = "172.16.200.100";
String MTP_Port = "7778";
Runtime runtime = Runtime.instance();
Profile profile = new ProfileImpl(host, port, null, true);
profile.setParameter(Profile.MTPS, "jade.mtp.http.MessageTransportProtocol(http://"+MTP_hostIP+":"+MTP_Port+"/acc)");
// create container
AgentContainer container = runtime.createMainContainer(profile);
try {
AgentController ac = container.createNewAgent("AgentSmith",AgentSmith.class.getName(),null);
ac.start();
} catch (StaleProxyException e) {
e.printStackTrace();
}
还发现,如果我使用 localhost 作为主机 IP,使用 MTP 主机 的网络 IP,通信在我的 class B 网络中无法正常工作。将两个变量设置为相同的 IP 解决了这个问题。