handshaking
This commit is contained in:
@@ -12,6 +12,7 @@ import network.protocol.PacketVisitor;
|
|||||||
import network.protocol.packets.ChatMessagePacket;
|
import network.protocol.packets.ChatMessagePacket;
|
||||||
import network.protocol.packets.CreateRoomPacket;
|
import network.protocol.packets.CreateRoomPacket;
|
||||||
import network.protocol.packets.DisconnectPacket;
|
import network.protocol.packets.DisconnectPacket;
|
||||||
|
import network.protocol.packets.HandshakePacket;
|
||||||
import network.protocol.packets.JoinRoomPacket;
|
import network.protocol.packets.JoinRoomPacket;
|
||||||
import network.protocol.packets.LeaveRoomPacket;
|
import network.protocol.packets.LeaveRoomPacket;
|
||||||
import network.protocol.packets.LoginPacket;
|
import network.protocol.packets.LoginPacket;
|
||||||
@@ -20,18 +21,40 @@ import network.protocol.packets.RoomListPacket;
|
|||||||
import network.protocol.packets.SendChatMessagePacket;
|
import network.protocol.packets.SendChatMessagePacket;
|
||||||
import network.protocol.packets.ServerResponsePacket;
|
import network.protocol.packets.ServerResponsePacket;
|
||||||
|
|
||||||
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 SocketWriter writer;
|
||||||
private final SocketReader reader;
|
private final SocketReader reader;
|
||||||
private final ClientListener callback;
|
private final ClientListener callback;
|
||||||
|
private volatile boolean connected = false;
|
||||||
|
|
||||||
public ClientConnexion(DatagramSocket socket, InetSocketAddress serverAddress, ClientListener callback) {
|
public ClientConnexion(DatagramSocket socket, InetSocketAddress serverAddress, ClientListener callback) {
|
||||||
this.serverAddress = serverAddress;
|
this.serverAddress = serverAddress;
|
||||||
this.writer = new SocketWriter(socket);
|
this.writer = new SocketWriter(socket);
|
||||||
this.reader = new SocketReader(socket, this);
|
this.reader = new SocketReader(socket, this);
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
|
spamHandshake();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void spamHandshake() {
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
sendPacket(new HandshakePacket());
|
||||||
|
}
|
||||||
|
new Thread(() -> waitForHandshake()).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void waitForHandshake() {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if(!connected) {
|
||||||
|
System.out.println("The server did not respond !");
|
||||||
|
this.close();
|
||||||
|
this.callback.handleConnexionError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
@@ -43,7 +66,7 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{
|
|||||||
this.writer.sendPacket(packet, serverAddress);
|
this.writer.sendPacket(packet, serverAddress);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
this.close();
|
this.close();
|
||||||
this.callback.handleDisconnect();
|
this.callback.handleConnexionError();
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,9 +95,17 @@ public class ClientConnexion implements PacketVisitor, PacketHandler{
|
|||||||
@Override
|
@Override
|
||||||
public void visitPacket(DisconnectPacket packet) {
|
public void visitPacket(DisconnectPacket packet) {
|
||||||
this.close();
|
this.close();
|
||||||
|
this.connected = false;
|
||||||
this.callback.handleDisconnect();
|
this.callback.handleDisconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPacket(HandshakePacket packet) {
|
||||||
|
if (!connected)
|
||||||
|
this.callback.handleConnect();
|
||||||
|
this.connected = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitPacket(CreateRoomPacket packet) {
|
public void visitPacket(CreateRoomPacket packet) {
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
|
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
|
||||||
|
|||||||
@@ -15,9 +15,16 @@ public class ClientConsole implements ClientListener {
|
|||||||
private Client client;
|
private Client client;
|
||||||
private final Thread inputThread;
|
private final Thread inputThread;
|
||||||
private final Scanner scanner;
|
private final Scanner scanner;
|
||||||
|
private volatile boolean connected = false;
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new ClientConsole(new InetSocketAddress("localhost", 6665));
|
ClientConsole console = new ClientConsole(new InetSocketAddress("localhost", 6665));
|
||||||
|
try {
|
||||||
|
console.joinThread();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println("End !");
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClientConsole(InetSocketAddress address) {
|
public ClientConsole(InetSocketAddress address) {
|
||||||
@@ -34,7 +41,8 @@ public class ClientConsole implements ClientListener {
|
|||||||
|
|
||||||
private String inputPseudo() {
|
private String inputPseudo() {
|
||||||
System.out.println("Enter your pseudo:");
|
System.out.println("Enter your pseudo:");
|
||||||
String pseudo = this.scanner.nextLine();
|
String pseudo = "chatter";
|
||||||
|
pseudo = this.scanner.nextLine();
|
||||||
return pseudo;
|
return pseudo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,11 +51,24 @@ public class ClientConsole implements ClientListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void inputLoop() {
|
private void inputLoop() {
|
||||||
|
//waiting to be connected
|
||||||
|
try {
|
||||||
|
Thread.sleep(2000);
|
||||||
|
return;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
if (!connected)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// resets the interrupt
|
||||||
|
Thread.interrupted();
|
||||||
|
|
||||||
while (!Thread.interrupted()) {
|
while (!Thread.interrupted()) {
|
||||||
String message = scanner.nextLine();
|
String message = this.scanner.nextLine();
|
||||||
|
if (Thread.interrupted())
|
||||||
|
break;
|
||||||
visitMessage(message);
|
visitMessage(message);
|
||||||
}
|
}
|
||||||
this.scanner.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void joinThread() throws InterruptedException {
|
public void joinThread() throws InterruptedException {
|
||||||
@@ -88,23 +109,34 @@ public class ClientConsole implements ClientListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void stop() {
|
||||||
|
this.inputThread.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleDisconnect() {
|
public void handleDisconnect() {
|
||||||
System.out.println("Disconnected !");
|
System.out.println("Disconnected !");
|
||||||
this.inputThread.interrupt();
|
stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleConnexionError() {
|
||||||
|
System.out.println("An error occured during the connexion !");
|
||||||
|
this.connected = false;
|
||||||
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleChatMessage(Instant time, String chatter, String content) {
|
public void handleChatMessage(Instant time, String chatter, String content) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
String strTime = time.toString();
|
String strTime = time.toString();
|
||||||
sb.append("&y[");
|
sb.append("&y[")
|
||||||
sb.append(strTime, 11, 19); // We only take the HH:MM:SS part
|
.append(strTime, 11, 19) // We only take the HH:MM:SS part
|
||||||
sb.append("]&n");
|
.append("]&n")
|
||||||
sb.append(" ");
|
.append(" ")
|
||||||
sb.append(chatter);
|
.append(chatter)
|
||||||
sb.append(" : ");
|
.append(" : ")
|
||||||
sb.append(content).append("&n"); // make the color back to normal at the end of every message
|
.append(content).append("&n"); // make the color back to normal at the end of every message
|
||||||
System.out.println(ANSIColor.formatString(sb.toString()));
|
System.out.println(ANSIColor.formatString(sb.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,4 +157,11 @@ public class ClientConsole implements ClientListener {
|
|||||||
System.out.println(response);
|
System.out.println(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleConnect() {
|
||||||
|
System.out.println("Connected to server !");
|
||||||
|
this.connected = true;
|
||||||
|
this.inputThread.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import network.protocol.packets.ServerResponsePacket;
|
|||||||
public interface ClientListener {
|
public interface ClientListener {
|
||||||
|
|
||||||
void handleDisconnect();
|
void handleDisconnect();
|
||||||
|
void handleConnexionError();
|
||||||
|
void handleConnect();
|
||||||
void handleChatMessage(Instant time, String chatter, String content);
|
void handleChatMessage(Instant time, String chatter, String content);
|
||||||
void handleRoomList(List<String> roomNames);
|
void handleRoomList(List<String> roomNames);
|
||||||
void handleServerResponse(ServerResponsePacket.Response response);
|
void handleServerResponse(ServerResponsePacket.Response response);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package network.protocol;
|
|||||||
import network.protocol.packets.ChatMessagePacket;
|
import network.protocol.packets.ChatMessagePacket;
|
||||||
import network.protocol.packets.CreateRoomPacket;
|
import network.protocol.packets.CreateRoomPacket;
|
||||||
import network.protocol.packets.DisconnectPacket;
|
import network.protocol.packets.DisconnectPacket;
|
||||||
|
import network.protocol.packets.HandshakePacket;
|
||||||
import network.protocol.packets.JoinRoomPacket;
|
import network.protocol.packets.JoinRoomPacket;
|
||||||
import network.protocol.packets.LeaveRoomPacket;
|
import network.protocol.packets.LeaveRoomPacket;
|
||||||
import network.protocol.packets.LoginPacket;
|
import network.protocol.packets.LoginPacket;
|
||||||
@@ -20,6 +21,7 @@ public interface PacketVisitor {
|
|||||||
void visitPacket(ChatMessagePacket packet);
|
void visitPacket(ChatMessagePacket packet);
|
||||||
void visitPacket(CreateRoomPacket packet);
|
void visitPacket(CreateRoomPacket packet);
|
||||||
void visitPacket(DisconnectPacket packet);
|
void visitPacket(DisconnectPacket packet);
|
||||||
|
void visitPacket(HandshakePacket packet);
|
||||||
void visitPacket(JoinRoomPacket packet);
|
void visitPacket(JoinRoomPacket packet);
|
||||||
void visitPacket(LeaveRoomPacket packet);
|
void visitPacket(LeaveRoomPacket packet);
|
||||||
void visitPacket(LoginPacket packet);
|
void visitPacket(LoginPacket packet);
|
||||||
|
|||||||
14
ChatApp/src/network/protocol/packets/HandshakePacket.java
Normal file
14
ChatApp/src/network/protocol/packets/HandshakePacket.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package network.protocol.packets;
|
||||||
|
|
||||||
|
import network.protocol.Packet;
|
||||||
|
import network.protocol.PacketVisitor;
|
||||||
|
|
||||||
|
public class HandshakePacket extends Packet {
|
||||||
|
public HandshakePacket() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(PacketVisitor packetVisitor) {
|
||||||
|
packetVisitor.visitPacket(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import network.protocol.PacketVisitor;
|
|||||||
import network.protocol.packets.ChatMessagePacket;
|
import network.protocol.packets.ChatMessagePacket;
|
||||||
import network.protocol.packets.CreateRoomPacket;
|
import network.protocol.packets.CreateRoomPacket;
|
||||||
import network.protocol.packets.DisconnectPacket;
|
import network.protocol.packets.DisconnectPacket;
|
||||||
|
import network.protocol.packets.HandshakePacket;
|
||||||
import network.protocol.packets.JoinRoomPacket;
|
import network.protocol.packets.JoinRoomPacket;
|
||||||
import network.protocol.packets.LeaveRoomPacket;
|
import network.protocol.packets.LeaveRoomPacket;
|
||||||
import network.protocol.packets.LoginPacket;
|
import network.protocol.packets.LoginPacket;
|
||||||
@@ -99,6 +100,12 @@ public class ServerConnexion implements PacketVisitor {
|
|||||||
this.onDisconnect();
|
this.onDisconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPacket(HandshakePacket packet) {
|
||||||
|
System.out.println("[Server] Handshake received from " + clientAddress);
|
||||||
|
sendPacket(packet);
|
||||||
|
}
|
||||||
|
|
||||||
private void onDisconnect() {
|
private void onDisconnect() {
|
||||||
if (this.server.isInRoom(this)) {
|
if (this.server.isInRoom(this)) {
|
||||||
this.onRoomLeave(this.server.getRoomName(this));
|
this.onRoomLeave(this.server.getRoomName(this));
|
||||||
|
|||||||
Reference in New Issue
Block a user