mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2024-11-27 02:40:51 +01:00
fix g-earth not recognizing when client disconnects
This commit is contained in:
parent
70261751d6
commit
c9bdcdd5b3
@ -101,7 +101,6 @@ public class NormalProxyProvider extends ProxyProvider {
|
|||||||
while ((hConnection.getState() == HState.WAITING_FOR_CLIENT) && !proxy_server.isClosed()) {
|
while ((hConnection.getState() == HState.WAITING_FOR_CLIENT) && !proxy_server.isClosed()) {
|
||||||
try {
|
try {
|
||||||
Socket client = proxy_server.accept();
|
Socket client = proxy_server.accept();
|
||||||
client.setTcpNoDelay(true);
|
|
||||||
proxy = potentialProxy;
|
proxy = potentialProxy;
|
||||||
closeAllProxies(proxy);
|
closeAllProxies(proxy);
|
||||||
if (HConnection.DEBUG) System.out.println("accepted a proxy");
|
if (HConnection.DEBUG) System.out.println("accepted a proxy");
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package gearth.protocol.connection.proxy;
|
package gearth.protocol.connection.proxy;
|
||||||
|
|
||||||
|
import com.sun.corba.se.impl.orbutil.concurrent.Mutex;
|
||||||
import gearth.protocol.HConnection;
|
import gearth.protocol.HConnection;
|
||||||
import gearth.protocol.connection.HProxy;
|
import gearth.protocol.connection.HProxy;
|
||||||
import gearth.protocol.connection.HProxySetter;
|
import gearth.protocol.connection.HProxySetter;
|
||||||
@ -8,12 +9,13 @@ import gearth.protocol.connection.HStateSetter;
|
|||||||
import gearth.protocol.memory.Rc4Obtainer;
|
import gearth.protocol.memory.Rc4Obtainer;
|
||||||
import gearth.protocol.packethandler.IncomingPacketHandler;
|
import gearth.protocol.packethandler.IncomingPacketHandler;
|
||||||
import gearth.protocol.packethandler.OutgoingPacketHandler;
|
import gearth.protocol.packethandler.OutgoingPacketHandler;
|
||||||
|
import gearth.protocol.packethandler.PacketHandler;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
public abstract class ProxyProvider {
|
public abstract class ProxyProvider {
|
||||||
|
|
||||||
@ -30,19 +32,13 @@ public abstract class ProxyProvider {
|
|||||||
protected void startProxyThread(Socket client, Socket server, HProxy proxy) throws InterruptedException, UnknownHostException, IOException {
|
protected void startProxyThread(Socket client, Socket server, HProxy proxy) throws InterruptedException, UnknownHostException, IOException {
|
||||||
final boolean[] datastream = new boolean[1];
|
final boolean[] datastream = new boolean[1];
|
||||||
server.setTcpNoDelay(true);
|
server.setTcpNoDelay(true);
|
||||||
|
client.setTcpNoDelay(true);
|
||||||
OutputStream client_out = client.getOutputStream();
|
|
||||||
InputStream client_in = client.getInputStream();
|
|
||||||
OutputStream habbo_server_out = server.getOutputStream();
|
|
||||||
InputStream habbo_server_in = server.getInputStream();
|
|
||||||
|
|
||||||
if (HConnection.DEBUG) System.out.println(server.getLocalAddress().getHostAddress() + ": " + server.getLocalPort());
|
if (HConnection.DEBUG) System.out.println(server.getLocalAddress().getHostAddress() + ": " + server.getLocalPort());
|
||||||
|
|
||||||
final boolean[] aborted = new boolean[1];
|
|
||||||
Rc4Obtainer rc4Obtainer = new Rc4Obtainer(hConnection);
|
Rc4Obtainer rc4Obtainer = new Rc4Obtainer(hConnection);
|
||||||
|
|
||||||
OutgoingPacketHandler outgoingHandler = new OutgoingPacketHandler(habbo_server_out, hConnection.getTrafficObservables());
|
OutgoingPacketHandler outgoingHandler = new OutgoingPacketHandler(server.getOutputStream(), hConnection.getTrafficObservables());
|
||||||
IncomingPacketHandler incomingHandler = new IncomingPacketHandler(client_out, hConnection.getTrafficObservables());
|
IncomingPacketHandler incomingHandler = new IncomingPacketHandler(client.getOutputStream(), hConnection.getTrafficObservables());
|
||||||
rc4Obtainer.setPacketHandlers(outgoingHandler, incomingHandler);
|
rc4Obtainer.setPacketHandlers(outgoingHandler, incomingHandler);
|
||||||
|
|
||||||
outgoingHandler.addOnDatastreamConfirmedListener(hotelVersion -> {
|
outgoingHandler.addOnDatastreamConfirmedListener(hotelVersion -> {
|
||||||
@ -53,82 +49,44 @@ public abstract class ProxyProvider {
|
|||||||
onConnect();
|
onConnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
// wachten op data van client
|
Semaphore abort = new Semaphore(0);
|
||||||
new Thread(() -> {
|
|
||||||
try {
|
|
||||||
while (!client.isClosed() && (hConnection.getState() == HState.WAITING_FOR_CLIENT || hConnection.getState() == HState.CONNECTED)) {
|
|
||||||
byte[] buffer;
|
|
||||||
while (client_in.available() > 0) {
|
|
||||||
client_in.read(buffer = new byte[client_in.available()]);
|
|
||||||
outgoingHandler.act(buffer);
|
|
||||||
}
|
|
||||||
Thread.sleep(1);
|
|
||||||
|
|
||||||
}
|
handleInputStream(client, outgoingHandler, abort);
|
||||||
}
|
handleInputStream(server, incomingHandler, abort);
|
||||||
catch (IOException | InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (HConnection.DEBUG) System.out.println("abortclient");
|
|
||||||
try {
|
|
||||||
if (habbo_server_out != null) habbo_server_out.close();
|
|
||||||
if (habbo_server_in != null) habbo_server_in.close();
|
|
||||||
if (client_in != null) client_in.close();
|
|
||||||
if (client_out != null) client_out.close();
|
|
||||||
if (server != null && !server.isClosed()) server.close();
|
|
||||||
if (client != null && !client.isClosed()) client.close();
|
|
||||||
aborted[0] = true;
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
if (datastream[0]) {
|
|
||||||
onConnectEnd();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
// wachten op data van server
|
|
||||||
new Thread(() -> {
|
|
||||||
try {
|
|
||||||
while (!server.isClosed() && (hConnection.getState() == HState.WAITING_FOR_CLIENT || hConnection.getState() == HState.CONNECTED)) {
|
|
||||||
byte[] buffer;
|
|
||||||
while (habbo_server_in.available() > 0) {
|
|
||||||
habbo_server_in.read(buffer = new byte[habbo_server_in.available()]);
|
|
||||||
incomingHandler.act(buffer);
|
|
||||||
}
|
|
||||||
Thread.sleep(1);
|
|
||||||
}
|
|
||||||
} catch (IOException | InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (habbo_server_out != null) habbo_server_out.close();
|
|
||||||
if (habbo_server_in != null) habbo_server_in.close();
|
|
||||||
if (client_in != null) client_in.close();
|
|
||||||
if (client_out != null) client_out.close();
|
|
||||||
if (!server.isClosed()) server.close();
|
|
||||||
if (!client.isClosed()) client.close();
|
|
||||||
aborted[0] = true;
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
|
|
||||||
while(!aborted[0]) {
|
// abort can be acquired as soon as one of the sockets is closed
|
||||||
Thread.sleep(50);
|
abort.acquire();
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!server.isClosed()) server.close();
|
if (!server.isClosed()) server.close();
|
||||||
if (!client.isClosed()) client.close();
|
if (!client.isClosed()) client.close();
|
||||||
if (HConnection.DEBUG) System.out.println("STOP");
|
if (HConnection.DEBUG) System.out.println("STOP");
|
||||||
|
if (datastream[0]) {
|
||||||
|
onConnectEnd();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleInputStream(Socket socket, PacketHandler packetHandler, Semaphore abort) {
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
int readLength;
|
||||||
|
byte[] buffer = new byte[10000];
|
||||||
|
while (!socket.isClosed() &&
|
||||||
|
(hConnection.getState() == HState.WAITING_FOR_CLIENT || hConnection.getState() == HState.CONNECTED) &&
|
||||||
|
(readLength = socket.getInputStream().read(buffer)) != -1) {
|
||||||
|
packetHandler.act(Arrays.copyOf(buffer, readLength));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException ignore) {} finally {
|
||||||
|
abort.release();
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract void start() throws IOException;
|
public abstract void start() throws IOException;
|
||||||
public abstract void abort();
|
public abstract void abort();
|
||||||
|
@ -87,7 +87,6 @@ public class RawIpProxyProvider extends ProxyProvider {
|
|||||||
try {
|
try {
|
||||||
if (HConnection.DEBUG) System.out.println("try accept proxy");
|
if (HConnection.DEBUG) System.out.println("try accept proxy");
|
||||||
Socket client = proxy_server.accept();
|
Socket client = proxy_server.accept();
|
||||||
client.setTcpNoDelay(true);
|
|
||||||
|
|
||||||
if (HConnection.DEBUG) System.out.println("accepted a proxy");
|
if (HConnection.DEBUG) System.out.println("accepted a proxy");
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ public class PayloadBuffer {
|
|||||||
return receive();
|
return receive();
|
||||||
}
|
}
|
||||||
public void push(byte[] tcpData) {
|
public void push(byte[] tcpData) {
|
||||||
buffer = buffer.length == 0 ? tcpData : combineByteArrays(buffer, tcpData);
|
buffer = buffer.length == 0 ? tcpData.clone() : combineByteArrays(buffer, tcpData);
|
||||||
}
|
}
|
||||||
public HPacket[] receive() {
|
public HPacket[] receive() {
|
||||||
if (buffer.length < 6) return new HPacket[0];
|
if (buffer.length < 6) return new HPacket[0];
|
||||||
|
Loading…
Reference in New Issue
Block a user