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