Finished (hopefully)
parent
9c9647b992
commit
e7c4f781a2
|
|
@ -5,37 +5,94 @@ import java.net.DatagramPacket;
|
||||||
import java.net.DatagramSocket;
|
import java.net.DatagramSocket;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.print.attribute.standard.Severity;
|
||||||
|
|
||||||
|
import vs.AsciiChars.L032;
|
||||||
|
import vs.AsciiChars.L048;
|
||||||
|
import vs.AsciiChars.L128;
|
||||||
|
import vs.AsciiChars.L255;
|
||||||
|
import vs.SyslogMessage.Facility;
|
||||||
|
import vs.SyslogMessage.TextMessage;
|
||||||
|
|
||||||
public class Client {
|
public class Client {
|
||||||
private static final int BUFSIZE = 512;
|
private static final int BUFSIZE = 512;
|
||||||
|
|
||||||
|
private static final String BROADCAST_ADDRESS = "255.255.255.255";
|
||||||
|
private static final int DISCOVERY_PORT = 8888;
|
||||||
|
private static final int SYSLOG_PORT = 514;
|
||||||
|
|
||||||
|
static DatagramPacket packetOutDisover = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
|
static DatagramPacket packetInOffer = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
|
static DatagramPacket packetOutRequest = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
|
static DatagramPacket packetInAcknowledge = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
|
|
||||||
|
static DatagramPacket packetOutSyslog = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
try (DatagramSocket socket = new DatagramSocket()) {
|
try (DatagramSocket socket = new DatagramSocket()) {
|
||||||
socket.setBroadcast(true);
|
socket.setBroadcast(true);
|
||||||
|
|
||||||
//? Get Server IP
|
//? SEND DISOVERY
|
||||||
String message = "DISCOVER_SERVERS";
|
String messageString = "DISCOVER";
|
||||||
byte[] buffer = message.getBytes();
|
byte[] message = messageString.getBytes();
|
||||||
|
|
||||||
InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
|
packetOutDisover.setAddress(InetAddress.getByName(BROADCAST_ADDRESS));
|
||||||
int discoveryPort = 8888;
|
packetOutDisover.setPort(DISCOVERY_PORT);
|
||||||
|
packetOutDisover.setData(message);
|
||||||
|
packetOutDisover.setLength(message.length);
|
||||||
|
|
||||||
DatagramPacket packetOutDisover = new DatagramPacket(buffer, buffer.length, broadcastAddress, discoveryPort);
|
|
||||||
socket.send(packetOutDisover);
|
socket.send(packetOutDisover);
|
||||||
|
|
||||||
|
|
||||||
//? Got server IP
|
//? GET OFFER + SEND REQUEST
|
||||||
DatagramPacket packetIn = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
socket.receive(packetInOffer);
|
||||||
socket.receive(packetIn);
|
String receivedOffer = new String(packetInOffer.getData(), 0, packetInOffer.getLength());
|
||||||
|
System.out.println("Received Offer: " + receivedOffer);
|
||||||
|
|
||||||
System.out.println("Recieved Server IP " + packetIn.getSocketAddress());
|
messageString = "REQUEST";
|
||||||
|
message = messageString.getBytes();
|
||||||
|
|
||||||
|
packetOutRequest.setAddress(packetInOffer.getAddress());
|
||||||
|
packetOutRequest.setPort(DISCOVERY_PORT);
|
||||||
|
packetOutRequest.setData(message);
|
||||||
|
packetOutRequest.setLength(message.length);
|
||||||
|
|
||||||
|
socket.send(packetOutRequest);
|
||||||
|
|
||||||
|
|
||||||
|
//? GET ACKNOWLEDGE
|
||||||
|
socket.receive(packetInAcknowledge);
|
||||||
|
String receivedAckowledge = new String(packetInAcknowledge.getData(), 0, packetInAcknowledge.getLength());
|
||||||
|
System.out.println("Received Acknowledge: " + receivedAckowledge);
|
||||||
|
InetAddress syslogServerAddress = packetInAcknowledge.getAddress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//? SEND SYSLOG
|
||||||
|
System.out.println("Recieved Server IP " + syslogServerAddress);
|
||||||
|
|
||||||
DatagramPacket packetOutSyslog = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
DatagramPacket packetOutSyslog = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
packetOutSyslog.setAddress(packetIn.getAddress());
|
packetOutSyslog.setAddress(syslogServerAddress);
|
||||||
int syslogPort = 514;
|
packetOutSyslog.setPort(SYSLOG_PORT);
|
||||||
packetOutSyslog.setPort(syslogPort);
|
|
||||||
|
|
||||||
String syslogMessage = formatSyslogMessage(message);
|
TextMessage textMessage = new TextMessage("message");
|
||||||
byte[] syslogMessageBytes = syslogMessage.getBytes();
|
|
||||||
|
SyslogMessage syslogMessage = new SyslogMessage(
|
||||||
|
SyslogMessage.Facility.USER,
|
||||||
|
SyslogMessage.Severity.INFORMATIONAL,
|
||||||
|
new L255("192.168.2.100"),
|
||||||
|
new L048("java"),
|
||||||
|
new L128("1"),
|
||||||
|
new L032("1"),
|
||||||
|
new StructuredData(new ArrayList<>()),
|
||||||
|
textMessage
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
String syslogMessageString = syslogMessage.toString();
|
||||||
|
byte[] syslogMessageBytes = syslogMessageString.getBytes();
|
||||||
|
|
||||||
packetOutSyslog.setData(syslogMessageBytes);
|
packetOutSyslog.setData(syslogMessageBytes);
|
||||||
packetOutSyslog.setLength(syslogMessageBytes.length);
|
packetOutSyslog.setLength(syslogMessageBytes.length);
|
||||||
|
|
@ -48,23 +105,4 @@ public class Client {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String formatSyslogMessage(String message) {
|
|
||||||
// Basic RFC 5424 format without structured data
|
|
||||||
// <PRI>TIMESTAMP HOSTNAME APPNAME PID MESSAGEID [STRUCTURED-DATA] MSG
|
|
||||||
// Since you ignore structured data, we skip that part
|
|
||||||
|
|
||||||
int facility = 16; // local0
|
|
||||||
int severity = 6; // informational
|
|
||||||
int pri = (facility * 8) + severity;
|
|
||||||
|
|
||||||
String timestamp = java.time.Instant.now().toString();
|
|
||||||
String hostname = "test-client";
|
|
||||||
String appName = "SyslogTest";
|
|
||||||
String procId = "12345";
|
|
||||||
String msgId = "TEST001";
|
|
||||||
|
|
||||||
return String.format("<%d>1 %s %s %s %s %s - %s",
|
|
||||||
pri, timestamp, hostname, appName, procId, msgId, message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,12 @@ import java.net.DatagramPacket;
|
||||||
import java.net.DatagramSocket;
|
import java.net.DatagramSocket;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
|
||||||
// Discovery-Responder (ähnlich DHCP-Verhalten, aber minimal):
|
|
||||||
// - Hört auf UDP/8888 und akzeptiert Broadcasts
|
|
||||||
// - Antwortet mit leerem UDP-Paket direkt an den Absender
|
|
||||||
// - Client kann aus der Quell-IP der Antwort die Server-IP ermitteln
|
|
||||||
public class DiscoveryServer implements Runnable {
|
public class DiscoveryServer implements Runnable {
|
||||||
|
private static final int BUFSIZE = 512;
|
||||||
|
|
||||||
|
DatagramPacket packetInDiscover = new DatagramPacket(new byte[BUFSIZE], BUFSIZE);
|
||||||
|
|
||||||
private final int port;
|
private final int port;
|
||||||
|
|
||||||
public DiscoveryServer(int port) {
|
public DiscoveryServer(int port) {
|
||||||
|
|
@ -18,8 +19,9 @@ public class DiscoveryServer implements Runnable {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
System.out.println("Discovery running on " + port);
|
System.out.println("Discovery running on " + port);
|
||||||
|
|
||||||
try (DatagramSocket discoverySocket = new DatagramSocket(port)) {
|
try (DatagramSocket discoverySocket = new DatagramSocket(port)) {
|
||||||
discoverySocket.setReuseAddress(true);
|
// discoverySocket.setReuseAddress(true);
|
||||||
discoverySocket.setBroadcast(true);
|
discoverySocket.setBroadcast(true);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,11 @@
|
||||||
package vs;
|
package vs;
|
||||||
|
|
||||||
// Einstiegspunkt der Anwendung:
|
|
||||||
// - Startet zwei Threads: Syslog-UDP-Server (Port 514) und Discovery-Server (Port 8888)
|
|
||||||
// - Erfüllt die Vorgaben: UDP-only, keine TLS, zwei Sockets, Konsolen-Ausgabe
|
|
||||||
public class Main {
|
public class Main {
|
||||||
private static final int SYSLOG_PORT = 514; // Standard-Syslog-Port (UDP)
|
private static final int SYSLOG_PORT = 514;
|
||||||
private static final int DISCOVERY_PORT = 8888; // Port für Auto-Discovery
|
private static final int DISCOVERY_PORT = 8888;
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// System.out.println("Syslog server is running on UDP/514 and discovery on UDP/8888...");
|
|
||||||
// Thread 1: Empfängt Syslog-Nachrichten und druckt Sender-IP + Nachricht
|
|
||||||
new Thread(new SyslogUdpServer(SYSLOG_PORT), "syslog").start();
|
|
||||||
// Thread 2: Beantwortet Broadcast-Anfragen und verrät so die Server-IP
|
|
||||||
new Thread(new DiscoveryServer(DISCOVERY_PORT), "discovery").start();
|
new Thread(new DiscoveryServer(DISCOVERY_PORT), "discovery").start();
|
||||||
|
new Thread(new SyslogUdpServer(SYSLOG_PORT), "syslog").start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8,7 +8,7 @@ import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
|
||||||
public class Server {
|
public class Server {
|
||||||
private static final int BUFFSIZE = 512; //? Maybe andere Größe
|
private static final int BUFFSIZE = 512;
|
||||||
private static final ExecutorService executor = Executors.newFixedThreadPool(2);
|
private static final ExecutorService executor = Executors.newFixedThreadPool(2);
|
||||||
|
|
||||||
public interface PacketHandler {
|
public interface PacketHandler {
|
||||||
|
|
@ -47,7 +47,14 @@ public class Server {
|
||||||
static class SyslogHandler implements PacketHandler {
|
static class SyslogHandler implements PacketHandler {
|
||||||
@Override
|
@Override
|
||||||
public void handlePacket(DatagramSocket socket, DatagramPacket packetIn, String serviceName) {
|
public void handlePacket(DatagramSocket socket, DatagramPacket packetIn, String serviceName) {
|
||||||
|
final int MAX_LENGTH = 2048;
|
||||||
|
|
||||||
|
if (packetIn.getLength() > MAX_LENGTH){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String receivedSyslog = new String(packetIn.getData(), 0, packetIn.getLength());
|
||||||
|
System.out.println(receivedSyslog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,10 +64,24 @@ public class Server {
|
||||||
DatagramPacket packetOut = new DatagramPacket(new byte[BUFFSIZE], BUFFSIZE);
|
DatagramPacket packetOut = new DatagramPacket(new byte[BUFFSIZE], BUFFSIZE);
|
||||||
|
|
||||||
packetOut.setSocketAddress(packetIn.getSocketAddress());
|
packetOut.setSocketAddress(packetIn.getSocketAddress());
|
||||||
packetOut.setData(new byte[0]);
|
|
||||||
packetOut.setLength(0);
|
|
||||||
|
|
||||||
System.out.println("Found client, responding");
|
String receivedDataString = new String(packetIn.getData(), 0, packetIn.getLength());
|
||||||
|
// System.out.println("Discorvery Packet: " + receivedDataString);
|
||||||
|
|
||||||
|
byte[] repsonseMessage;
|
||||||
|
if (receivedDataString.equals("DISCOVER")) {
|
||||||
|
repsonseMessage = "OFFER".getBytes();
|
||||||
|
}
|
||||||
|
else if (receivedDataString.equals("REQUEST")) {
|
||||||
|
repsonseMessage = "ACKNOWLEDGE".getBytes();
|
||||||
|
// System.out.println("Acknowledged client: " + packetIn.getSocketAddress());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
repsonseMessage = "ERROR".getBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
packetOut.setData(repsonseMessage);
|
||||||
|
packetOut.setLength(repsonseMessage.length);
|
||||||
|
|
||||||
socket.send(packetOut);
|
socket.send(packetOut);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,9 @@ import java.net.DatagramPacket;
|
||||||
import java.net.DatagramSocket;
|
import java.net.DatagramSocket;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
|
||||||
// UDP-Syslog-Empfänger:
|
|
||||||
// - Hört auf Port 514 (UDP), kein TLS
|
|
||||||
// - Prüft maximale Nachrichtenlänge (hier 1024 Bytes, RFC 5426 Empfehlung)
|
|
||||||
// - Gibt pro Nachricht die Absender-IP:Port und den Text auf der Konsole aus
|
|
||||||
public class SyslogUdpServer implements Runnable {
|
public class SyslogUdpServer implements Runnable {
|
||||||
private final int port;
|
private final int port;
|
||||||
// Maximale Länge (vereinfachte Vorgabe; UDP-Empfänger sollten ~1024 Bytes unterstützen)
|
|
||||||
private static final int MAX_MESSAGE_LENGTH = 1024;
|
private static final int MAX_MESSAGE_LENGTH = 1024;
|
||||||
|
|
||||||
public SyslogUdpServer(int port) {
|
public SyslogUdpServer(int port) {
|
||||||
|
|
@ -19,20 +15,18 @@ public class SyslogUdpServer implements Runnable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
System.out.println("Syslog running on " + port);
|
System.out.println("Syslog running on " + port + "\n");
|
||||||
// Socket öffnen und auf allen Interfaces an Port 514 lauschen
|
|
||||||
try (DatagramSocket syslogSocket = new DatagramSocket(port)) {
|
try (DatagramSocket syslogSocket = new DatagramSocket(port)) {
|
||||||
syslogSocket.setReuseAddress(true); // erlaubt schnelles Neu-Starten
|
syslogSocket.setReuseAddress(true);
|
||||||
byte[] buffer = new byte[MAX_MESSAGE_LENGTH + 1]; // +1 als einfache Oversize-Erkennung
|
byte[] buffer = new byte[MAX_MESSAGE_LENGTH + 1];
|
||||||
while (true) {
|
while (true) {
|
||||||
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
||||||
syslogSocket.receive(packet); // UDP-Paket empfangen
|
syslogSocket.receive(packet);
|
||||||
System.out.println("SYSLOG from " + packet.getSocketAddress());
|
|
||||||
|
|
||||||
int len = packet.getLength();
|
int len = packet.getLength();
|
||||||
InetAddress clientAddress = packet.getAddress();
|
InetAddress clientAddress = packet.getAddress();
|
||||||
|
|
||||||
// Zu lange Nachrichten verwerfen (Aufgabenforderung: Länge prüfen)
|
|
||||||
if (len > MAX_MESSAGE_LENGTH) {
|
if (len > MAX_MESSAGE_LENGTH) {
|
||||||
System.err.println("Dropped oversized UDP syslog (" + len + " > " + MAX_MESSAGE_LENGTH
|
System.err.println("Dropped oversized UDP syslog (" + len + " > " + MAX_MESSAGE_LENGTH
|
||||||
+ ") from " + clientAddress.getHostAddress() + ":" + packet.getPort());
|
+ ") from " + clientAddress.getHostAddress() + ":" + packet.getPort());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue