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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user