big socket refactor

This commit is contained in:
2025-03-04 16:32:11 +01:00
parent 76da347fb9
commit 2bb3e64f2b
7 changed files with 109 additions and 104 deletions

View File

@@ -0,0 +1,90 @@
package network;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import network.protocol.Packet;
public class Socket {
private final DatagramSocket socket;
private final List<PacketHandler> handlers;
private final Thread readThread;
public Socket() throws SocketException {
this.socket = new DatagramSocket();
this.handlers = new ArrayList<>();
this.readThread = new Thread(this::readLoop);
this.readThread.start();
}
public Socket(int listeningPort) throws SocketException {
this.socket = new DatagramSocket(listeningPort);
this.handlers = new ArrayList<>();
this.readThread = new Thread(this::readLoop);
this.readThread.start();
}
public void addHandler(PacketHandler handler) {
this.handlers.add(handler);
}
public int getLocalPort() {
return this.socket.getLocalPort();
}
public void sendPacket(Packet packet, InetSocketAddress address) throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(stream);
oos.writeObject(packet);
oos.flush();
byte[] data = stream.toByteArray();
DatagramPacket dataPacket = new DatagramPacket(data, data.length, address.getAddress(),
address.getPort());
this.socket.send(dataPacket);
}
public Entry<Packet, InetSocketAddress> recievePacket() throws IOException, ClassNotFoundException {
byte[] buffer = new byte[65535];
DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length);
socket.receive(dataPacket);
InetSocketAddress address = new InetSocketAddress(dataPacket.getAddress(), dataPacket.getPort());
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(dataPacket.getData()));
Packet packet = (Packet) ois.readObject();
return Map.entry(packet, address);
}
public void close() {
this.socket.close();
}
private void handlePacket(Packet packet, InetSocketAddress address) {
for (PacketHandler handler : this.handlers) {
handler.handlePacket(packet, address);
}
}
private void readLoop() {
try {
while (!Thread.interrupted()) {
var entry = this.recievePacket();
this.handlePacket(entry.getKey(), entry.getValue());
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}