big socket refactor
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
90
ChatApp/app/src/main/java/network/Socket.java
Normal file
90
ChatApp/app/src/main/java/network/Socket.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user