basic client/server structure

This commit is contained in:
2025-02-27 12:52:12 +01:00
parent 2917535e05
commit fed666200c
9 changed files with 381 additions and 5 deletions

View File

@@ -0,0 +1,9 @@
package network;
import java.net.InetSocketAddress;
import network.protocol.Packet;
public interface PacketHandler {
void handlePacket(Packet packet, InetSocketAddress address);
}

View File

@@ -0,0 +1,48 @@
package network;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import network.protocol.Packet;
public class SocketReader {
private final DatagramSocket socket;
private final Thread readThread;
private final PacketHandler handler;
public SocketReader(DatagramSocket socket, PacketHandler handler) {
this.socket = socket;
this.handler = handler;
this.readThread = new Thread(this::readLoop);
this.readThread.start();
}
public void stop() {
this.readThread.interrupt();
}
private void readLoop() {
while (!Thread.interrupted()) {
try {
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();
this.handler.handlePacket(packet, address);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,30 @@
package network;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import network.protocol.Packet;
public class SocketWriter {
private final DatagramSocket socket;
public SocketWriter(DatagramSocket socket) {
this.socket = socket;
}
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);
}
}