Did the refactoring necessary to get the client and server to live happily

together in one JVM and both interoperate with the AWT thread in a manner
so harmonious as to bring a tear to the eye. This was surprisingly much
easier that I expected, thanks to my eminently sensible initial design,
I'm sure. ;)


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3360 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2005-02-20 00:37:34 +00:00
parent 41fb0b1b80
commit 121f6d7e53
6 changed files with 172 additions and 95 deletions
@@ -208,7 +208,7 @@ public class Client
*/
public DObjectManager getDObjectManager ()
{
return (_comm != null) ? _comm.getDObjectManager() : null;
return _omgr;
}
/**
@@ -408,6 +408,37 @@ public class Client
return true;
}
/**
* Called by the {@link ClientDObjectMgr} when our bootstrap
* notification arrives. If the client and server are being run in
* "merged" mode in a single JVM, this is how the client is configured
* with the server's distributed object manager and provided with
* bootstrap data.
*/
public void gotBootstrap (BootstrapData data, DObjectManager omgr)
{
Log.debug("Got bootstrap " + data + ".");
// keep these around for interested parties
_bstrap = data;
_omgr = omgr;
// extract bootstrap information
_cloid = data.clientOid;
// initialize our invocation director
_invdir.init(omgr, _cloid, this);
// send a few pings to the server to establish the clock offset
// between this client and server standard time
establishClockDelta(System.currentTimeMillis());
// we can't quite call initialization completed at this point
// because we need for the invocation director to fully initialize
// (which requires a round trip to the server) before turning the
// client loose to do things like request invocation services
}
/**
* Called every five seconds; ensures that we ping the server if we
* haven't communicated in a long while and periodically resyncs the
@@ -452,12 +483,14 @@ public class Client
*/
protected void establishClockDelta (long now)
{
// create a new delta calculator and start the process
_dcalc = new DeltaCalculator();
PingRequest req = new PingRequest();
_comm.postMessage(req);
_dcalc.sentPing(req);
_lastSync = now;
if (_comm != null) {
// create a new delta calculator and start the process
_dcalc = new DeltaCalculator();
PingRequest req = new PingRequest();
_comm.postMessage(req);
_dcalc.sentPing(req);
_lastSync = now;
}
}
/**
@@ -535,6 +568,7 @@ public class Client
public void run () {
// clear out our references
_comm = null;
_omgr = null;
_clobj = null;
_cloid = -1;
// and let our invocation director know we're logged off
@@ -543,32 +577,6 @@ public class Client
});
}
/**
* Called by the omgr when a bootstrap notification arrives.
*/
void gotBootstrap (BootstrapData data)
{
Log.debug("Got bootstrap " + data + ".");
// keep this around for interested parties
_bstrap = data;
// extract bootstrap information
_cloid = data.clientOid;
// initialize our invocation director
_invdir.init(_comm.getDObjectManager(), _cloid, this);
// send a few pings to the server to establish the clock offset
// between this client and server standard time
establishClockDelta(System.currentTimeMillis());
// we can't quite call initialization completed at this point
// because we need for the invocation director to fully initialize
// (which requires a round trip to the server) before turning the
// client loose to do things like request invocation services
}
/**
* Called when we receive a pong packet. We may be in the process of
* calculating the client/server time differential, or we may have
@@ -670,6 +678,9 @@ public class Client
* client thread (which is also the AWT thread). */
protected RunQueue _runQueue;
/** The distributed object manager we're using during this session. */
protected DObjectManager _omgr;
/** The data associated with our authentication response. */
protected AuthResponseData _authData;
@@ -184,7 +184,7 @@ public class ClientDObjectMgr
// do the proper thing depending on the object
if (obj instanceof BootstrapNotification) {
BootstrapData data = ((BootstrapNotification)obj).getData();
_client.gotBootstrap(data);
_client.gotBootstrap(data, this);
} else if (obj instanceof EventNotification) {
DEvent evt = ((EventNotification)obj).getEvent();
@@ -83,16 +83,6 @@ public class Communicator
_client = client;
}
/**
* Returns the distributed object manager in effect for this session.
* This instance is only valid while the client is connected to the
* server.
*/
public DObjectManager getDObjectManager ()
{
return _omgr;
}
/**
* Logs on to the server and initiates our full-duplex message
* exchange.