From 2cb70a41fb8f0496b31c7f4ff1fdb3cbb01b7f89 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Wed, 13 Oct 2021 13:48:47 +0800 Subject: [PATCH] fix(multiplayer): forget to respond handshake. --- .../hmcl/ui/multiplayer/MultiplayerClient.java | 1 + .../hmcl/ui/multiplayer/MultiplayerPage.java | 4 ++-- .../hmcl/ui/multiplayer/MultiplayerServer.java | 9 +++++++++ .../multiplayer/MultiplayerClientServerTest.java | 16 ++++++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClient.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClient.java index 3757e43a3..97c35b2e3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClient.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClient.java @@ -101,6 +101,7 @@ public class MultiplayerClient extends Thread { // We fail to establish the connection with server. try { + LOG.log(Level.WARNING, "Socket connection timeout, closing socket"); socket.close(); } catch (IOException e) { LOG.log(Level.WARNING, "Failed to close socket", e); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java index 80ad4ddbc..3018ae755 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java @@ -20,7 +20,7 @@ package org.jackhuang.hmcl.ui.multiplayer; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialogLayout; import de.javawi.jstun.test.DiscoveryInfo; -import de.javawi.jstun.test.FastDiscoveryTest; +import de.javawi.jstun.test.DiscoveryTest; import javafx.application.Platform; import javafx.beans.property.*; import javafx.collections.FXCollections; @@ -128,7 +128,7 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP private void testNAT() { Task.supplyAsync(() -> { - FastDiscoveryTest tester = new FastDiscoveryTest(null, 0, "stun.stunprotocol.org", 3478); + DiscoveryTest tester = new DiscoveryTest(null, 0, "stun.stunprotocol.org", 3478); return tester.test(); }).whenComplete(Schedulers.javafx(), (info, exception) -> { LOG.log(Level.INFO, "Nat test result " + MultiplayerPageSkin.getNATType(info), exception); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerServer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerServer.java index 98ac37805..d73435c6d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerServer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerServer.java @@ -43,6 +43,7 @@ public class MultiplayerServer extends Thread { private final EventManager onClientAdded = new EventManager<>(); private final EventManager onClientDisconnected = new EventManager<>(); private final EventManager onKeepAlive = new EventManager<>(); + private final EventManager onHandshake = new EventManager<>(); private final Map clients = new ConcurrentHashMap<>(); private final Map nameClientMap = new ConcurrentHashMap<>(); @@ -71,6 +72,10 @@ public class MultiplayerServer extends Thread { return onKeepAlive; } + public EventManager onHandshake() { + return onHandshake; + } + public void startServer() throws IOException { startServer(0); } @@ -178,6 +183,10 @@ public class MultiplayerServer extends Thread { endpoint.write(new KeepAliveResponse(System.currentTimeMillis())); onKeepAlive.fireEvent(new Event(this)); + } else if (request instanceof HandshakeRequest) { + endpoint.write(new HandshakeResponse()); + + onHandshake.fireEvent(new Event(this)); } else { LOG.log(Level.WARNING, "Unrecognized packet from client " + targetSocket.getRemoteSocketAddress() + ":" + line); } diff --git a/HMCL/src/test/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClientServerTest.java b/HMCL/src/test/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClientServerTest.java index 1f106adde..47a4f2faa 100644 --- a/HMCL/src/test/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClientServerTest.java +++ b/HMCL/src/test/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerClientServerTest.java @@ -18,26 +18,38 @@ package org.jackhuang.hmcl.ui.multiplayer; import org.jackhuang.hmcl.util.Logging; +import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; +import java.util.concurrent.atomic.AtomicBoolean; + public class MultiplayerClientServerTest { @Test @Ignore public void startServer() throws Exception { Logging.initForTest(); + int localPort = MultiplayerManager.findAvailablePort(); MultiplayerServer server = new MultiplayerServer(1000, true); - server.startServer(44444); + server.startServer(localPort); - MultiplayerClient client = new MultiplayerClient("username", 44444); + MultiplayerClient client = new MultiplayerClient("username", localPort); client.start(); + AtomicBoolean handshakeReceived = new AtomicBoolean(false); + + server.onHandshake().register(event -> { + handshakeReceived.set(true); + }); + server.onKeepAlive().register(event -> { client.interrupt(); server.interrupt(); }); server.join(); + + Assert.assertTrue(handshakeReceived.get()); } }