JADE 實現跨機器 Agent 通信,必須解決兩大基礎設施問題:**防火牆端口開放**與 **AID 地址完整性**。
ping 主機名 可解析 IPAID 必須包含:
name@host:port/JADE 格式(如 ams@gjpc:1099/JADE)https://gjpc:7778/acc)public class SenderAgent extends Agent {
protected void setup() {
AID remoteAMS = new AID("ams@remote-host:1099/JADE");
remoteAMS.addAddresses("https://remote-host:7778/acc"); // 關鍵!
try {
SearchConstraints sc = new SearchConstraints();
sc.setMaxResults(new Long(-1));
AMSAgentDescription[] agents = AMSService.search(this, remoteAMS, new AMSAgentDescription(), sc);
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.setContent("Hello from " + getLocalName());
for (AMSAgentDescription desc : agents) {
AID receiver = desc.getName();
if (receiver.equals(getAID())) continue; // 跳過自己
receiver.addAddresses("https://remote-host:7778/acc"); // 接收端也需完整地址!
msg.addReceiver(receiver);
}
send(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
| 現象 | 根因 | 解決 |
|---|---|---|
| 搜索遠程 AMS 失敗 | 防火牆阻擋 1099/7778 端口 | 開放端口或配置隧道 |
| 消息發送無響應 | Receiver AID 缺少 addAddresses | 雙向補全 Addresses |
| 主機名解析失敗 | DNS/hosts 未配置 | 配置 hosts 或使用 IP 直連 |
createRemoteAID(host, port, name) 工具方法統一構建-Djava.rmi.server.hostname=實際IP 解決 RMI 綁定問題