Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1279978
  • 博文数量: 135
  • 博客积分: 10588
  • 博客等级: 上将
  • 技术积分: 1325
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-18 11:12
文章分类

全部博文(135)

文章存档

2013年(6)

2012年(3)

2011年(11)

2010年(7)

2009年(14)

2008年(6)

2007年(42)

2006年(46)

分类: Java

2006-12-25 16:27:03


很多朋友问到普通程序与Agent的交互,这里有了。

main函数中动态创建Agent可以通过先创建另一个容器,然后再这个容器中创建Aent的方法。比如:

public static void main(String[] args) {

        // TODO code application logic here

        Runtime rt = Runtime.instance();

        rt.setCloseVM(true);

        ContainerController cc =  rt.createAgentContainer(new ProfileImpl(false));

       

        AgentController pingAgent = null;

        try {

            // create agent and start it

            (cc.createNewAgent("hello", "jadeclient.HelloWorldAgent", new Object[0])).start();

        } catch (Exception e){}

    }

  

可以写如下测试程序,这里用netbeans平台,一个HelloWorldAgent,他将被动态创建并向主容器中的server发送一个消息:

package jadeclient;

 

/**

 *

 * @author admin

 */

import jade.core.*;

import jade.core.Agent;

import jade.core.AID;

import jade.lang.acl.ACLMessage;

import jade.core.behaviours.SimpleBehaviour;

 

public class HelloWorldAgent extends Agent {

    public void setup(){

           

            addBehaviour(new SimpleBehaviour(this){

                boolean finished=false;

                AID server = new AID( "server", AID.ISLOCALNAME );

                public void action()

                {

                    System.out.println("我的本地名称是:"+getLocalName());

                    ACLMessage msg = new ACLMessage(ACLMessage.INFORM);

                    msg.setContent("消息内容"  );

                    msg.addReceiver(server);

                    send(msg);

                    System.out.println("已经往主容器中的server发送信息#");

                    block( 1000 );

                                       

                   finished=true;

                 }

                 public boolean done()

                {

                   return finished;

                 }

 

            });

        

        };

}

server角色是收到消息后打印出来。

/*

 * ReceiverAgent.java

 *

 * Created on 2006年12月25, 下午3:28

 *

 * To change this template, choose Tools | Template Manager

 * and open the template in the editor.

 */

 

package jadeclient;

import jade.core.Agent;

import jade.core.AID;

import jade.core.behaviours.OneShotBehaviour;

import jade.core.behaviours.CyclicBehaviour;

import jade.lang.acl.ACLMessage;

/**

 *

 * @author admin

 */

public class ReceiverAgent extends Agent {

   

    /** Creates a new instance of ReceiverAgent */

   

    //把接收到的信息打印出来

    protected void setup()

    {

        addBehaviour(new CyclicBehaviour(this)

        {

             public void action() {

                ACLMessage msg= receive();

                if (msg!=null)

                    System.out.println( "收到信息 " +

                       myAgent.getLocalName() + " <- " +

                       msg.getContent() );

                block();

             }

        });

    }

 

}

所有类编译完成后,这里运行的时候先在命令行下java jade.Boot –gui,然后gui界面下创建一个名叫serverAgent,其类为jadeclient. ReceiverAgent.


然后运行main函数,成功后打印出的结果分别如上图,其中netbeans平台中下面显示的是hello打印出的信息,而命令行中显示的是server收到hello发的信息后打印出来的。可见不同容器中agent通信与在同一容器中通信并无二样。

阅读(5499) | 评论(9) | 转发(1) |
给主人留下些什么吧!~~

hongweiwhu2008-04-09 19:47:53

神僧,你写的关于Agent方面的文章我全部看完了,大部分都运行了,从中收获很大,再此向你表示感谢。但是发现你有很长时间没有写Agent方面的文章了,希望你笔耕不辍,多写好文章!

hongweiwhu2008-04-04 14:44:10

运行很正确,很好,我想请教下,使用Agent能不能调用本地应用程序呢? 比如在机器1中有个应用程序application1,同时也有一个Agent1,在另一台机器上有一个Agent2,能不能通过Agent2与Agent1进行通信调用application1呢?