//总体来看,这个例子相当简单。每个联邦成员都订阅一个交互communication,订阅一个Participant对象类的属性name。并且,同时都发布一个交互communication,发布一个Participant对象类的属性name。
//因此,当一个新的联邦成员产生时,他会通过得到别的联邦发布的name属性感知别的联邦的存在。
//
package se.pitch.chat1516;
import hla.rti1516.*;
import se.pitch.prti1516.Encoder;
import se.pitch.prti1516.FederateAmbassadorImpl;
import se.pitch.prti1516.RTI;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
//此前无话,都是对类库的 import
class Chat extends FederateAmbassadorImpl {
private RTIambassador _rtiAmbassador;
private final String[] _args;
private InteractionClassHandle _messageId;
private ParameterHandle _parameterIdText;
private ParameterHandle _parameterIdSender;
private ObjectClassHandle _participantId;
private ObjectInstanceHandle _userId;
private AttributeHandle _attributeIdName;
private String _username;
private volatile boolean _reservationComplete;
private volatile boolean _reservationSucceeded;
private final Object _reservationSemaphore = new Object();
private static final int CRC_PORT = 8989;
private static final String FEDERATION_NAME = "ChatRoom";
//以上为变量定义
private static class Participant {
private String _name;
Participant(String name) { _name = name; }
public String toString() { return _name; }
}
private final Map _knownObjects = new HashMap();
//以下为主程序
public static void main(String[] args)
{
new Chat(args).run();
}
private Chat(String[] args) { _args = args; } //这个是chat类的构造函数
private void run()
{
try
{
//以下程序接收命令行参数或者直接由用户输入CRC host的IP地址
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String rtiHost = "";
if (_args.length > 0) { rtiHost = _args[0]; }
else
{
System.out.print("Enter the IP address of the CRC host [localhost]: ");
rtiHost = in.readLine();
if (rtiHost.length() == 0) { rtiHost = "localhost";}
}
//以下为RTI初始化
try
{
_rtiAmbassador = RTI.getRTIambassador(rtiHost, CRC_PORT);
}