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

@@ -1,9 +1,9 @@
package client; package client;
import java.net.DatagramSocket;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketException; import java.net.SocketException;
import network.Socket;
import network.protocol.packets.*; import network.protocol.packets.*;
public class Client { public class Client {
@@ -12,7 +12,7 @@ public class Client {
private final ClientListener callback; private final ClientListener callback;
public Client(InetSocketAddress serverAddress, ClientListener callback, String pseudo) throws SocketException { public Client(InetSocketAddress serverAddress, ClientListener callback, String pseudo) throws SocketException {
this.connexion = new ClientConnexion(new DatagramSocket(), serverAddress, callback); this.connexion = new ClientConnexion(new Socket(), serverAddress, callback);
this.callback = callback; this.callback = callback;
login(pseudo); login(pseudo);
} }

View File

@@ -1,12 +1,10 @@
package client; package client;
import java.io.IOException; import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import network.PacketHandler; import network.PacketHandler;
import network.SocketReader; import network.Socket;
import network.SocketWriter;
import network.protocol.Packet; import network.protocol.Packet;
import network.protocol.PacketVisitor; import network.protocol.PacketVisitor;
import network.protocol.packets.*; import network.protocol.packets.*;
@@ -14,16 +12,15 @@ import network.protocol.packets.*;
public class ClientConnexion implements PacketVisitor, PacketHandler { public class ClientConnexion implements PacketVisitor, PacketHandler {
private final InetSocketAddress serverAddress; private final InetSocketAddress serverAddress;
private final SocketWriter writer; private final Socket socket;
private final SocketReader reader;
private final ClientListener callback; private final ClientListener callback;
private volatile boolean connected = false; private volatile boolean connected = false;
public ClientConnexion(DatagramSocket socket, InetSocketAddress serverAddress, ClientListener callback) { public ClientConnexion(Socket socket, InetSocketAddress serverAddress, ClientListener callback) {
this.serverAddress = serverAddress; this.serverAddress = serverAddress;
this.writer = new SocketWriter(socket); this.socket = socket;
this.reader = new SocketReader(socket, this);
this.callback = callback; this.callback = callback;
this.socket.addHandler(this);
spamHandshake(); spamHandshake();
} }
@@ -48,12 +45,12 @@ public class ClientConnexion implements PacketVisitor, PacketHandler {
} }
public void close() { public void close() {
this.reader.stop(); this.socket.close();
} }
public void sendPacket(Packet packet) { public void sendPacket(Packet packet) {
try { try {
this.writer.sendPacket(packet, serverAddress); this.socket.sendPacket(packet, serverAddress);
} catch (IOException e) { } catch (IOException e) {
this.close(); this.close();
this.callback.handleConnexionError(); this.callback.handleConnexionError();

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();
}
}
}

View File

@@ -1,49 +0,0 @@
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();
socket.close();
}
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

@@ -1,30 +0,0 @@
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);
}
}

View File

@@ -1,6 +1,5 @@
package server; package server;
import java.net.DatagramSocket;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketException; import java.net.SocketException;
import java.time.Instant; import java.time.Instant;
@@ -9,7 +8,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import network.PacketHandler; import network.PacketHandler;
import network.SocketReader; import network.Socket;
import network.protocol.ANSIColor; import network.protocol.ANSIColor;
import network.protocol.Packet; import network.protocol.Packet;
import network.protocol.packets.ChatMessagePacket; import network.protocol.packets.ChatMessagePacket;
@@ -17,17 +16,16 @@ import network.protocol.packets.SendChatMessagePacket;
public class Server implements PacketHandler { public class Server implements PacketHandler {
private final DatagramSocket serverSocket; private final Socket serverSocket;
private final Map<InetSocketAddress, ServerConnexion> connexions; private final Map<InetSocketAddress, ServerConnexion> connexions;
private final Map<InetSocketAddress, Instant> connexionTimes; private final Map<InetSocketAddress, Instant> connexionTimes;
private final SocketReader reader;
private final Map<String, ArrayList<ServerConnexion>> rooms; private final Map<String, ArrayList<ServerConnexion>> rooms;
public Server(int port) throws SocketException { public Server(int port) throws SocketException {
this.serverSocket = new DatagramSocket(port); this.serverSocket = new Socket(port);
this.serverSocket.addHandler(this);
this.connexions = new HashMap<>(); this.connexions = new HashMap<>();
this.connexionTimes = new HashMap<>(); this.connexionTimes = new HashMap<>();
this.reader = new SocketReader(serverSocket, this);
this.rooms = new HashMap<>(); this.rooms = new HashMap<>();
} }
@@ -101,7 +99,7 @@ public class Server implements PacketHandler {
} }
public void close() { public void close() {
this.reader.stop(); this.serverSocket.close();
} }
public boolean hasChatterName(String pseudo) { public boolean hasChatterName(String pseudo) {

View File

@@ -1,11 +1,10 @@
package server; package server;
import java.io.IOException; import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.time.Instant; import java.time.Instant;
import network.SocketWriter; import network.Socket;
import network.protocol.Packet; import network.protocol.Packet;
import network.protocol.PacketVisitor; import network.protocol.PacketVisitor;
import network.protocol.packets.*; import network.protocol.packets.*;
@@ -15,13 +14,13 @@ public class ServerConnexion implements PacketVisitor {
private final Server server; private final Server server;
private final InetSocketAddress clientAddress; private final InetSocketAddress clientAddress;
private final SocketWriter writer; private final Socket socket;
private String chatterName; private String chatterName;
public ServerConnexion(Server server, DatagramSocket socket, InetSocketAddress clientAddress) { public ServerConnexion(Server server, Socket socket, InetSocketAddress clientAddress) {
this.clientAddress = clientAddress; this.clientAddress = clientAddress;
this.server = server; this.server = server;
this.writer = new SocketWriter(socket); this.socket = socket;
} }
public String getChatterName() { public String getChatterName() {
@@ -30,7 +29,7 @@ public class ServerConnexion implements PacketVisitor {
public void sendPacket(Packet packet) { public void sendPacket(Packet packet) {
try { try {
this.writer.sendPacket(packet, clientAddress); this.socket.sendPacket(packet, clientAddress);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
this.server.removeConnexion(this); this.server.removeConnexion(this);