established connection between Client and Serveur, setting up basic interactions

This commit is contained in:
Clément
2025-02-27 22:04:11 +01:00
parent fed666200c
commit db9b41b190
8 changed files with 160 additions and 21 deletions

View File

@@ -1,4 +1,5 @@
import java.net.InetSocketAddress;
import java.util.Scanner;
import client.Client;
import server.Server;
@@ -8,8 +9,13 @@ public class ChatApp {
Server server = new Server(6665);
Client client = new Client(new InetSocketAddress("localhost", 6665));
while (true) {
client.SendCreateRoom("Room1");
client.RequestRoomList();
while (true) {
Scanner scan = new Scanner(System.in);
String message = scan.nextLine();
client.SendChatMessage(message);
}
}
}

View File

@@ -5,13 +5,21 @@ import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import network.protocol.packets.LoginPacket;
import network.protocol.packets.SendChatMessagePacket;
import network.protocol.packets.*;
public class Client {
private final ClientConnexion connexion;
public static void main(String[] args) {
try {
Client client = new Client(new InetSocketAddress("localhost", 6665));
client.SendChatMessage("Hello");
} catch (SocketException e) {
e.printStackTrace();
}
}
public Client(InetSocketAddress serverAddress) throws SocketException {
this.connexion = new ClientConnexion(new DatagramSocket(), serverAddress);
login("Moi");
@@ -32,4 +40,20 @@ public class Client {
e.printStackTrace();
}
}
public void SendCreateRoom(String roomName) {
try {
this.connexion.sendPacket(new CreateRoomPacket(roomName));
} catch (Exception e) {
e.printStackTrace();
}
}
public void RequestRoomList() {
try {
this.connexion.sendPacket(new RequestRoomListPacket());
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -3,6 +3,7 @@ package client;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.time.Instant;
import network.PacketHandler;
import network.SocketReader;
@@ -47,7 +48,14 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{
@Override
public void visitPacket(ChatMessagePacket packet) {
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
StringBuilder sb = new StringBuilder();
String time = packet.getTime().toString();
sb.append(time, 11, 19); // We only take the HH:MM:SS part
sb.append(" ");
sb.append(packet.getChatter());
sb.append(" : ");
sb.append(packet.getContent());
System.out.println(sb);
}
@Override
@@ -77,8 +85,12 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{
@Override
public void visitPacket(RoomListPacket packet) {
System.out.println("Handled room list !");
// System.out.println("Handled room list !");
// throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
System.out.println("Rooms :");
for (String room : packet.getRoomNames()) {
System.out.println("\t" + room);
}
}
@Override

View File

@@ -9,7 +9,7 @@ public class ServerResponsePacket extends Packet {
static private final long serialVersionUID = Packets.Login.ordinal();
public static enum Response {
AuthSuccess, AuthError, RoomCreated, RoomNotCreated, RoomJoined, RoomNotJoined, NotInRoom;
AuthSuccess, AuthError, RoomCreated, RoomNotCreated, RoomJoined, RoomNotJoined, NotInRoom, RoomLeft, RoomNotLeft, messageSent, messageNotSent;
};
private final Response response;

View File

@@ -3,6 +3,7 @@ package server;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -10,23 +11,75 @@ import java.util.Map;
import network.PacketHandler;
import network.SocketReader;
import network.protocol.Packet;
import network.protocol.Packets;
import network.protocol.packets.ChatMessagePacket;
import network.protocol.packets.SendChatMessagePacket;
import network.protocol.packets.ServerResponsePacket;
public class Server implements PacketHandler {
private final DatagramSocket serverSocket;
private final Map<InetSocketAddress, ServerConnexion> connexions;
private final SocketReader reader;
private final ArrayList<String> roomNames;
private final Map<String, ArrayList<ServerConnexion>> roomNames;
public Server(int port) throws SocketException {
this.serverSocket = new DatagramSocket(port);
this.connexions = new HashMap<>();
this.reader = new SocketReader(serverSocket, this);
this.roomNames = new ArrayList<>();
this.roomNames = new HashMap<>();
}
public ArrayList<String> getRoomNames() {
return roomNames;
return roomNames.keySet().stream().collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
}
public String getRoomName(ServerConnexion connexion) {
for (Map.Entry<String, ArrayList<ServerConnexion>> entry : roomNames.entrySet()) {
if(entry.getValue().contains(connexion)) {
return entry.getKey();
}
}
return null;
}
public void createRoom(String roomName, ServerConnexion connexion) throws SocketException {
if(roomNames.containsKey(roomName)) {
throw new SocketException("Room already exists");
}
roomNames.put(roomName, new ArrayList<>());
roomNames.get(roomName).add(connexion);
}
public void leaveRoom(ServerConnexion connexion) throws SocketException {
String roomName = getRoomName(connexion);
if(roomName != null) {
roomNames.get(roomName).remove(connexion);
// Remove the room if it is empty
if(roomNames.get(roomName).isEmpty()) {
roomNames.remove(roomName);
}
return;
}
throw new SocketException("Room does not exist");
}
public void joinRoom(String roomName, ServerConnexion connexion) throws SocketException {
if(roomNames.containsKey(roomName)) {
roomNames.get(roomName).add(connexion);
return;
}
throw new SocketException("Room does not exist");
}
public void sendToRoom(ServerConnexion connexion, SendChatMessagePacket packet) throws SocketException {
String roomName = getRoomName(connexion);
ChatMessagePacket chatPacket = new ChatMessagePacket(Instant.now(), connexion.getChatterName(), packet.getContent());
if(roomName != null && roomNames.containsKey(roomName)) {
roomNames.get(roomName).forEach(con -> con.sendPacket(chatPacket));
return;
}
throw new SocketException("You are not in a room or the room does not exist");
}
public void close() {
@@ -34,11 +87,8 @@ public class Server implements PacketHandler {
}
public boolean hasChatterName(String pseudo) {
for (var entry : this.connexions.entrySet()) {
if (pseudo.equals(entry.getValue().getChatterName()))
return true;
}
return false;
return this.connexions.values().stream()
.anyMatch(connexion -> pseudo.equals(connexion.getChatterName()));
}
@Override

View File

@@ -3,6 +3,7 @@ package server;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import network.SocketWriter;
import network.protocol.Packet;
@@ -45,22 +46,38 @@ public class ServerConnexion implements PacketVisitor {
@Override
public void visitPacket(ChatMessagePacket packet) {
// I'm never supposed to receive this from the client
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
}
@Override
public void visitPacket(CreateRoomPacket packet) {
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
try {
server.createRoom(packet.getRoomName(), this);
sendPacket(new ServerResponsePacket(Response.RoomCreated));
} catch (SocketException e) {
sendPacket(new ServerResponsePacket(Response.RoomNotCreated));
}
}
@Override
public void visitPacket(JoinRoomPacket packet) {
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
try {
server.joinRoom(packet.getRoomName(), this);
sendPacket(new ServerResponsePacket(Response.RoomJoined));
} catch (SocketException e) {
sendPacket(new ServerResponsePacket(Response.RoomNotJoined));
}
}
@Override
public void visitPacket(LeaveRoomPacket packet) {
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
try {
server.leaveRoom(this);
sendPacket(new ServerResponsePacket(Response.RoomLeft));
} catch (SocketException e) {
sendPacket(new ServerResponsePacket(Response.RoomNotLeft));
}
}
@Override
@@ -77,21 +94,28 @@ public class ServerConnexion implements PacketVisitor {
@Override
public void visitPacket(RequestRoomListPacket packet) {
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
sendPacket(new RoomListPacket(server.getRoomNames()));
}
@Override
public void visitPacket(RoomListPacket packet) {
// I'm never supposed to receive this from the client
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
}
@Override
public void visitPacket(SendChatMessagePacket packet) {
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
try {
server.sendToRoom(this, packet);
sendPacket(new ServerResponsePacket(Response.messageSent));
} catch (SocketException e) {
sendPacket(new ServerResponsePacket(Response.messageNotSent));
}
}
@Override
public void visitPacket(ServerResponsePacket packet) {
// I'm never supposed to receive this from the client
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
}