Archived
Private
Public Access
1
0
This repository has been archived on 2026-02-04. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ProjectBackup/Java/Messenger/src/main/java/de/craftix/messenger/ServerConnection.java
2022-09-04 12:45:01 +02:00

92 lines
3.0 KiB
Java

package de.craftix.messenger;
import de.craftix.server.Packet;
import de.craftix.server.Server;
import sun.misc.Unsafe;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.Socket;
public class ServerConnection {
private static ObjectInputStream in;
private static ObjectOutputStream out;
private static Thread clientThread;
public static void connect() {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(Server.IP, Server.PORT), 5000);
out = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
out.flush();
in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
disableWarning();
System.out.println("Connected to Server");
startThread();
}catch (Exception e) { e.printStackTrace(); }
}
private static void startThread() {
clientThread = new Thread(() -> {
while (!clientThread.isInterrupted()) {
try {
Object o = in.readObject();
if (o instanceof Packet) {
Packet packet = (Packet) o;
Packet output = handlePacket(packet);
out.writeObject(output);
out.flush();
}
}catch (Exception e) { e.printStackTrace(); }
}
});
clientThread.start();
}
private static Packet handlePacket(Packet packet) {
if (packet.getType() == Packet.PacketType.PING)
return new Packet(Packet.PacketType.PING, null);
return new Packet(Packet.PacketType.BOOLEAN, false);
}
public static Packet sendRequest(Packet packet) {
Packet answer = new Packet(Packet.PacketType.BOOLEAN, false);
try {
//Kill Thread
Method m = Thread.class.getDeclaredMethod("stop0", Object.class);
m.setAccessible(true);
m.invoke(clientThread, new ThreadDeath());
out.writeObject(packet);
out.flush();
Object o = in.readObject();
if (o instanceof Packet)
answer = (Packet) o;
}catch (Exception e) { e.printStackTrace(); }
finally { startThread(); }
return answer;
}
private static void disableWarning() {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe u = (Unsafe) theUnsafe.get(null);
Class<?> cls = Class.forName("jdk.internal.module.IllegalAccessLogger");
Field logger = cls.getDeclaredField("logger");
u.putObjectVolatile(cls, u.staticFieldOffset(logger), null);
} catch (Exception ignored) {}
}
}