Be smarter about quick-disconnects, don't count them as preferred ports. If we have a disconnect within 5 seconds, we set the _next_ port in the list as our preferred port. This should address the windows network sharing issue.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4227 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -33,6 +33,7 @@ import java.net.InetSocketAddress;
|
|||||||
|
|
||||||
import com.samskivert.swing.RuntimeAdjust;
|
import com.samskivert.swing.RuntimeAdjust;
|
||||||
import com.samskivert.util.IntListUtil;
|
import com.samskivert.util.IntListUtil;
|
||||||
|
import com.samskivert.util.Interval;
|
||||||
import com.samskivert.util.LoopingThread;
|
import com.samskivert.util.LoopingThread;
|
||||||
import com.samskivert.util.Queue;
|
import com.samskivert.util.Queue;
|
||||||
import com.samskivert.util.StringUtil;
|
import com.samskivert.util.StringUtil;
|
||||||
@@ -443,11 +444,14 @@ public class Communicator
|
|||||||
// try connecting on each of the ports in succession
|
// try connecting on each of the ports in succession
|
||||||
for (int ii = 0; ii < ports.length; ii++) {
|
for (int ii = 0; ii < ports.length; ii++) {
|
||||||
int port = ports[(ii+ppidx)%ports.length];
|
int port = ports[(ii+ppidx)%ports.length];
|
||||||
|
int nextPort = ports[(ii+ppidx+1)%ports.length];
|
||||||
Log.info("Connecting [host=" + host + ", port=" + port + "].");
|
Log.info("Connecting [host=" + host + ", port=" + port + "].");
|
||||||
InetSocketAddress addr = new InetSocketAddress(host, port);
|
InetSocketAddress addr = new InetSocketAddress(host, port);
|
||||||
try {
|
try {
|
||||||
_channel = SocketChannel.open(addr);
|
_channel = SocketChannel.open(addr);
|
||||||
PresentsPrefs.config.setValue(pportKey, port);
|
_prefPortInterval =
|
||||||
|
new PrefPortInterval(port, nextPort, pportKey);
|
||||||
|
_prefPortInterval.schedule(PREF_PORT_DELAY);
|
||||||
break;
|
break;
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
if (ioe instanceof ConnectException && ii < ports.length) {
|
if (ioe instanceof ConnectException && ii < ports.length) {
|
||||||
@@ -486,7 +490,7 @@ public class Communicator
|
|||||||
AuthResponse rsp = (AuthResponse)receiveMessage();
|
AuthResponse rsp = (AuthResponse)receiveMessage();
|
||||||
AuthResponseData data = rsp.getData();
|
AuthResponseData data = rsp.getData();
|
||||||
Log.debug("Got auth response: " + data);
|
Log.debug("Got auth response: " + data);
|
||||||
|
|
||||||
// if the auth request failed, we want to let the communicator
|
// if the auth request failed, we want to let the communicator
|
||||||
// know by throwing a logon exception
|
// know by throwing a logon exception
|
||||||
if (!data.code.equals(AuthResponseData.SUCCESS)) {
|
if (!data.code.equals(AuthResponseData.SUCCESS)) {
|
||||||
@@ -544,6 +548,13 @@ public class Communicator
|
|||||||
|
|
||||||
protected void didShutdown ()
|
protected void didShutdown ()
|
||||||
{
|
{
|
||||||
|
// If we haven't recorded a preferred port yet, instead do the
|
||||||
|
// failure action since we didn't stay connected long enough.
|
||||||
|
if (_prefPortInterval != null) {
|
||||||
|
_prefPortInterval.cancel();
|
||||||
|
_prefPortInterval.failed();
|
||||||
|
}
|
||||||
|
|
||||||
// let the communicator know when we finally go away
|
// let the communicator know when we finally go away
|
||||||
readerDidExit();
|
readerDidExit();
|
||||||
}
|
}
|
||||||
@@ -613,6 +624,31 @@ public class Communicator
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected class PrefPortInterval extends Interval
|
||||||
|
{
|
||||||
|
public PrefPortInterval (int thisPort, int nextPort, String key)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
_thisPort = thisPort;
|
||||||
|
_nextPort = nextPort;
|
||||||
|
_key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void expired () {
|
||||||
|
PresentsPrefs.config.setValue(_key, _thisPort);
|
||||||
|
_prefPortInterval = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void failed () {
|
||||||
|
PresentsPrefs.config.setValue(_key, _nextPort);
|
||||||
|
_prefPortInterval = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String _key;
|
||||||
|
protected int _thisPort;
|
||||||
|
protected int _nextPort;
|
||||||
|
}
|
||||||
|
|
||||||
protected Client _client;
|
protected Client _client;
|
||||||
protected Reader _reader;
|
protected Reader _reader;
|
||||||
protected Writer _writer;
|
protected Writer _writer;
|
||||||
@@ -634,6 +670,13 @@ public class Communicator
|
|||||||
protected ClientDObjectMgr _omgr;
|
protected ClientDObjectMgr _omgr;
|
||||||
protected ClassLoader _loader;
|
protected ClassLoader _loader;
|
||||||
|
|
||||||
|
/** We use this interval to record the preferred port if it stays connected
|
||||||
|
* long enough. */
|
||||||
|
protected PrefPortInterval _prefPortInterval;
|
||||||
|
|
||||||
|
/** Time a port must remain connected before we mark it as preferred. */
|
||||||
|
protected static long PREF_PORT_DELAY = 5000L;
|
||||||
|
|
||||||
/** Used to control low-level message logging. */
|
/** Used to control low-level message logging. */
|
||||||
protected static RuntimeAdjust.BooleanAdjust _logMessages =
|
protected static RuntimeAdjust.BooleanAdjust _logMessages =
|
||||||
new RuntimeAdjust.BooleanAdjust(
|
new RuntimeAdjust.BooleanAdjust(
|
||||||
|
|||||||
Reference in New Issue
Block a user