-
Notifications
You must be signed in to change notification settings - Fork 0
ServerFAQ
- Organizacion del Servidor
- Como crear comandos
- Como funciona el reconocimiento de comandos
- Sockets y su forma de proceso
El servidor esta organizado por las siguientes clases:
| Nombre de la Clase | Descripcion |
|---|---|
| ServerLauncher | Clase encargada del lanzamiento del servidor asi como de todas las clases y metodos auxiliares. |
| Server | Clase del Servidor. Esta clase se encargara del mantenimiento del servidor. |
| ServerCommands | Clase encargada de guardar el mapa con los comandos existentes. |
| ServerSocketHandler | Clase encargada de atender las peticiones de los sockets. |
Para crear nuevos comandos, lo primero que necesitaremos, es tener una clase con la funcion que queremos agregar como comando. Por ahora, todas las funciones han de tener como argumentos un array de tipo string. A continuación abriremos el archivo data/methodList y agregaremos una linea al final del documento con la siguiente estructura:
nombreDelComando paquete1.paquete2.***.nombreDeLaClase nombreDeLaFuncion
En la siguiente compilación que se haga del servidor, el nuevo comando será funcional.
El funcionamiento interno de los comandos se produce dentro de la clase ServerCommands. Dentro de esta clase hemos creado una interfaz Commando con la siguiente estructura:
interface Command{
String runCommand(String[] arr);
}
Esta interfaz nos permite establecer una forma de ejecutar comandos desde el Hashmap<String, Command> el cual se declara de forma estatica. Posteriormente, se recorre linea a linea el archivo methodList, añadiendo a el mapa cada uno de los identificadores de los comandos junto a el metodo asociado:
while ((line = br.readLine()) != null) {
String[] sLine = line.split(" ");
metodos.put(sLine[0], new Command() {
public String runCommand(String[] arr) {
try {
Class<?> temp = Class.forName(sLine[1]);
Method method = temp.getMethod(sLine[2], sLine.getClass());
//sLine es de tipo Array<String>, de ahi el sLine.getClass()
return (String) method.invoke(null, new Object[]{arr});
} catch (ClassNotFoundException e) {
...
}
return null;
}});
}
A partir de aquí solo necesitamos invocar el metodo desde el mapa:
ServerCommands.metodos.get(command).runCommand(arr)
Aviso: Para que el mapa pueda ejecutar la funcion, esta ha de ser una funcion static.