From 499a65d5fb50e6acf153517cfa2c7f4d3fc933d6 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sat, 24 Sep 2022 23:03:07 +0800 Subject: [PATCH] fix(multiplayer): connection. --- .../multiplayer/LocalServerBroadcaster.java | 32 ++++++++++++------- .../hmcl/ui/multiplayer/MultiplayerPage.java | 2 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/LocalServerBroadcaster.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/LocalServerBroadcaster.java index 526c36ec4..9dfaac7ca 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/LocalServerBroadcaster.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/LocalServerBroadcaster.java @@ -22,10 +22,13 @@ import org.jackhuang.hmcl.event.EventManager; import org.jackhuang.hmcl.util.Lang; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.*; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; +import java.nio.channels.UnresolvedAddressException; import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.regex.Matcher; @@ -74,20 +77,26 @@ public class LocalServerBroadcaster implements AutoCloseable { if (!matcher.find()) { throw new MalformedURLException(); } - try (SocketChannel forwardingSocket = SocketChannel.open(new InetSocketAddress(matcher.group(0), Lang.parseInt(matcher.group(1), 0))); - ServerSocketChannel serverSocket = ServerSocketChannel.open()) { - serverSocket.socket().bind(null); + try (Socket forwardingSocket = new Socket(); + ServerSocket serverSocket = new ServerSocket()) { + forwardingSocket.setSoTimeout(30000); + forwardingSocket.connect(new InetSocketAddress(matcher.group(1), Lang.parseInt(matcher.group(2), 0))); - Thread broadcastMOTDThread = new Thread(threadGroup, () -> broadcastMOTD(serverSocket.socket().getLocalPort()), "BroadcastMOTD"); + serverSocket.bind(null); + + Thread broadcastMOTDThread = new Thread(threadGroup, () -> broadcastMOTD(serverSocket.getLocalPort()), "BroadcastMOTD"); broadcastMOTDThread.start(); + LOG.log(Level.INFO, "Listening " + serverSocket.getLocalSocketAddress()); + while (running) { - SocketChannel forwardedSocket = serverSocket.accept(); + Socket forwardedSocket = serverSocket.accept(); + LOG.log(Level.INFO, "Accepting client"); new Thread(threadGroup, () -> forwardTraffic(forwardingSocket, forwardedSocket), "Forward S->D").start(); new Thread(threadGroup, () -> forwardTraffic(forwardedSocket, forwardingSocket), "Forward D->S").start(); } } - } catch (IOException e) { + } catch (IOException | UnresolvedAddressException e) { LOG.log(Level.WARNING, "Error in forwarding port", e); } finally { close(); @@ -95,13 +104,14 @@ public class LocalServerBroadcaster implements AutoCloseable { } } - private void forwardTraffic(SocketChannel src, SocketChannel dest) { - try { - ByteBuffer buf = ByteBuffer.allocate(1024); + private void forwardTraffic(Socket src, Socket dest) { + try(InputStream is = src.getInputStream(); OutputStream os = dest.getOutputStream()) { + byte[] buf = new byte[1024]; while (true) { - int len = src.read(buf); + int len = is.read(buf, 0, buf.length); if (len < 0) break; - dest.write(buf); + LOG.log(Level.INFO, "Forwarding buffer " + len); + os.write(buf, 0, len); } } catch (IOException e) { LOG.log(Level.WARNING, "Disconnected", 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 fbaaa6e8c..b18e90c4b 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 @@ -243,7 +243,7 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP } private void onBroadcasterExit(Event event) { - this.broadcaster.set(null); + runInFX(() -> this.broadcaster.set(null)); } private void clearSession() {