big socket refactor
This commit is contained in:
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user