public class MathCommand implements java.io.Serializable {
�� private String operation; // +, *, -,
/, %, <, etc.
�� private float arg1;
�� private float arg2;
�� public void setOperation(String op) {
operation = op; }
�� public String getOperation() { return
operation; }
�� public float getArg1() { return arg1; }
�� public void setArg1(float arg) { arg1 =
arg; }
�� public float getArg2() { return arg2; }
�� public void setArg2(float arg) { arg2 =
arg; }
}
public class MathClient extends Agent {
�� protected void setup() {
����� MathCommand cmmd = new
MathCommand();
����� cmmd.setOperation("*");
����� cmmd.setArg1(6);
����� cmmd.setArg2(7);
����� ACLMessage msg = new ACLMessage(
ACLMessage.REQUEST );
�� �� msg.addReceiver(new
AID( "dt", AID.ISLOCALNAME));
�� �� try
{
����� �� msg.setContentObject(cmmd);
�� �� }
�� �� catch
(Exception e) {
�������� System.err.println(e.getMessage());
����� }
�� �� send(msg);
�� �� ACLMessage
result = blockingReceive();
�� �� System.out.println("result
= " + result.getContent());
�� }
}
A math server just adds a math behavior:
public class MathServer extends Agent {
�� protected void setup() {
����� addBehaviour(new
MathBehavior(this));
�� }
}
Here's the server's behavior:
class MathBehavior extends CyclicBehaviour {
�� public MathBehavior(Agent a) {
super(a); }
�� protected String execute(MathCommand
cmmd) {
����� String op = cmmd.getOperation();
����� float arg1 = cmmd.getArg1();
����� float arg2 = cmmd.getArg2();
����� if (op.equals("+")) return
"" + (arg1 + arg2);
����� if (op.equals("*")) return
"" + (arg1 * arg2);
����� if (op.equals("-")) return
"" + (arg1 - arg2);
����� if (op.equals("/")) return
"" + (arg1 / arg2);
����� if (op.equals("%")) return
"" + (arg1 % arg2);
����� if (op.equals("<"))
return "" + (arg1 < arg2);
����� if (op.equals("=")) return
"" + (arg1 = arg2);
����� return "unknown operator:
" + op;
�� }
�� public void action() {
����� ACLMessage msg = myAgent.receive();
����� if (msg == null) { block(); return;
} // cool!
����� try {
�������� MathCommand cmmd = (MathCommand)msg.getContentObject();
�� ����� String
result = execute(cmmd);
�������� ACLMessage answer =
msg.createReply();
�������� answer.setContent(result);
�������� myAgent.send(answer);
����� } catch(Exception e) {
�������� System.err.println(e.getMessage());
����� }
�� }
}
public interface MathVocabulary {
�� public static final String MATH_COMMAND
= "MathCommand";
�� public static final String
MATH_COMMAND_ARG1 = "arg1";
�� public static final String
MATH_COMMAND_ARG2 = "arg2";
�� public static final String
MATH_COMMAND_OP = "operation";
}
public class MathOntology extends
Ontology {
�� public static final String
ONTOLOGY_NAME = "Math-Ontology";
�� �// MathOntology is a singleton:
�� private static MathOntology instance =
new MathOntology();
�� public static MathOntology
getInstance() { return instance; }
�� private MathOntology() {
����� �super(ONTOLOGY_NAME, BasicOntology.getInstance());
����� �try {
�������� AgentActionSchema as =
����������� new
AgentActionSchema(MathVocabulary.MATH_COMMAND);
�������� add(as, MathCommand.class);
�������� as.add(MathVocabulary.MATH_COMMAND_ARG1,
����������� (PrimitiveSchema)
getSchema(BasicOntology.FLOAT),
����������� ObjectSchema.MANDATORY);
��������
as.add(MathVocabulary.MATH_COMMAND_ARG2,
����������� (PrimitiveSchema)
getSchema(BasicOntology.FLOAT),
����������� ObjectSchema.MANDATORY);
�������� as.add(MathVocabulary.MATH_COMMAND_OP,
����������� (PrimitiveSchema)
getSchema(BasicOntology.STRING),
����������� ObjectSchema.MANDATORY);
����� �} catch(Exception e) {
�������� �System.err.println(e.getMessage());
����� �}
�� }
}
public class MathClient extends Agent {
�� private Codec codec = new SLCodec();
// ???
�� private Ontology ontology =
MathOntology.getInstance();
�� protected void setup() {
����� �// Register language and ontology
����� getContentManager().registerLanguage(codec);
����� getContentManager().registerOntology(ontology);
����� MathCommand cmmd = new
MathCommand();
����� cmmd.setOperation("*");
����� cmmd.setArg1(6);
����� cmmd.setArg2(7);
����� sendMessage(
�������� ACLMessage.REQUEST, cmmd, new
AID( "dt", AID.ISLOCALNAME));
�� �� ACLMessage
result = blockingReceive();
�� �� System.out.println("result
= " + result.getContent());
�� }
�� void sendMessage(
����� int performative, AgentAction
action, AID server) {
����� ACLMessage msg = new
ACLMessage(performative);
����� msg.setLanguage(codec.getName());
����� msg.setOntology(ontology.getName());
����� try {
�������� getContentManager().fillContent(
����������� msg, new Action(server,
action));
�������� msg.addReceiver(server);
�������� send(msg);
����� } catch (Exception e) {
�������� System.err.println(e.getMessage());
����� }
�� }
}
public class MathServer extends Agent {
�� private Codec codec = new SLCodec();
��� private Ontology ontology =
MathOntology.getInstance();
�� protected void setup() {
����� // Register language and ontology
����� getContentManager().registerLanguage(codec);
�������
getContentManager().registerOntology(ontology);
����� addBehaviour(new MathBehavior(this));
�� }
}
class MathBehavior extends CyclicBehaviour {
�� // etc.
�� public void action() {
����� ACLMessage msg = myAgent.receive();
����� if (msg == null) { block(); return;
} // cool!
����� try {
�������� ContentElement content =
����������� myAgent.getContentManager().extractContent(msg);
�������� Concept action =
((Action)content).getAction();
�������� MathCommand cmmd =
(MathCommand)action;
�������� String result = execute(cmmd);
�������� ACLMessage answer =
msg.createReply();
�������� answer.setContent(result);
�������� myAgent.send(answer);
����� } catch(Exception e) {
�������� System.err.println(e.getMessage());
����� }
�� }
}