MANY UPDATES TO CLIENT/SERVER:Introduced a protocol parser interface and created an implementing class.

Introduced Input-Type Interface which is implemendet by the parameter class. This allowes the clients parser to more easily create an the NTtB-Protocol adhering message.
furthermore a ProtocolMessage interface implemented by NTtBFormatMsg abstract class.
parseMsg in NTtBProtocolParser
This commit is contained in:
Jonas 2022-03-23 12:59:30 +01:00 committed by Sebastian Lenzlinger
parent ccf36dff19
commit 7bb1407ef7
11 changed files with 113 additions and 14 deletions

View File

@ -8,7 +8,7 @@ public class Client {
private Socket socket;
private BufferedReader in;
private BufferedWriter out;
private BufferedWriter out;
public String userName;
public Client(Socket socket, String userName) {
@ -25,14 +25,10 @@ public class Client {
public void sendMessage() {
try {
out.write(userName);
out.newLine();
out.flush();
Scanner sc = new Scanner(System.in);
while (socket.isConnected()) {
String msg = sc.nextLine();
out.write(userName + ": " + msg);
out.write(userName + "says: " + msg);
out.newLine();
out.flush();
}

View File

@ -0,0 +1,44 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Client;
import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBCommands;
import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBFormatMsg;
import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBParameter;
import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.ProtocolParser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class NTtBProtocolParser implements ProtocolParser {
//TODO Possibly bad name, rename to clientMsgParser?
public static HashMap<String, NTtBCommands> inputMapper;
public NTtBProtocolParser(){
this.inputMapper = new HashMap<>();
this.inputMapper.put("chat",NTtBCommands.CHATG);
//TODO by far not done!
}
@Override
public NTtBFormatMsg parseMsg(String msg) {
Scanner sc = new Scanner(msg);
ArrayList<String> input = new ArrayList<>();
while(sc.hasNext()){
input.add(sc.next());
}
buildProtocolMsg(input);
return null;
//TODO needs to be finnished
}
private String buildProtocolMsg(ArrayList<String> input) {
//TODO
String cmd = parseCmd(input.get(0));
input.remove(0);
return "";
}
private String parseCmd(String s){
//TODO
return "";
}
}

View File

@ -0,0 +1,5 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
public enum NTtBCommands {
CRTGM, CHATL, CHATG, CHATP, LEAVG, JOING, VOTEE,
}

View File

@ -0,0 +1,9 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
public interface NTtBInputType {
String msg = null;
public String getValue();
public void setValue();
}

View File

@ -0,0 +1,18 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
public class NTtBParameter implements NTtBInputType {
String parameterValue;
public NTtBParameter(String parameterValue) {
this.parameterValue = parameterValue;
}
@Override
public String getValue() {
return parameterValue;
}
@Override
public void setValue() {
//Possibly do not need
}
}

View File

@ -0,0 +1,9 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
/*
The NightTrainProtocol implements the Communication-Protocol of the
"Night Train to Budapest"" game. It acts as an Interface between Client and server. All Client Messages are
piped through this protocol, in order for the Server to execute the correct action. It is used by the ClientHandler
for this purpose.
*/
public class NightTrainProtocol {
}

View File

@ -1,3 +0,0 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
public enum Protocol { }

View File

@ -0,0 +1,6 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
public class ProtocolMessage {
//TODO ProtocolMessage Implementation
//TODO definition of abilities and properties of class
}

View File

@ -0,0 +1,8 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol;
import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBFormatMsg;
public interface ProtocolParser {
public NTtBFormatMsg parseMsg(String msg);
}

View File

@ -5,13 +5,15 @@ import java.net.Socket;
import java.util.HashSet;
import java.util.Scanner;
public class ClientHandler implements Runnable{
public class ClientHandler implements Runnable {
private String clientUserName;
private BufferedWriter out;
private BufferedReader in;
private Socket socket;
Scanner sc;
public static HashSet<ClientHandler> clientHandlers = new HashSet<>();
public static HashSet<ClientHandler> inGameClients = new HashSet<>();
public static HashSet<ClientHandler> ghostClients = new HashSet<>();
public ClientHandler(Socket socket) {
try {
@ -35,8 +37,9 @@ public class ClientHandler implements Runnable{
try {
msg = in.readLine();
if( msg.equals("QUIT")){
if( msg.equalsIgnoreCase("QUIT")){
broadcastMessage("Client: " + clientUserName + " has left the Server");
removeClientHandler();
}
broadcastMessage(msg);
} catch (IOException e) {
@ -91,4 +94,8 @@ public class ClientHandler implements Runnable{
e.printStackTrace();
}
}
public void decodeMsg(String msg){
}
}

View File

@ -3,11 +3,13 @@ package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Scanner;
public class Server {
private static final int gamePort = 42069;
private HashSet<ClientHandler> connectedClients = new HashSet<>();
private ServerSocket serverSocket;
Scanner sc = new Scanner(System.in);
@ -19,12 +21,10 @@ public class Server {
try {
System.out.println("Port 42069 open on ");
while (!serverSocket.isClosed()) {
if(sc.next().equalsIgnoreCase("quit")) {
this.closeServerSocket();
}
Socket socket = serverSocket.accept();
ClientHandler nextClient = new ClientHandler(socket);
Thread th = new Thread(nextClient);
connectedClients.add(nextClient);
th.start();
}