mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-14 14:26:43 -04:00
fix(multiplayer): connection.
This commit is contained in:
parent
0b61f9856c
commit
499a65d5fb
@ -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);
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user