Skip to content
Snippets Groups Projects
Commit 8c6e048b authored by ismcarb's avatar ismcarb
Browse files

Copias

parent 70d4b8b0
No related branches found
No related tags found
No related merge requests found
Showing
with 885 additions and 16 deletions
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="0c5e7f40-d6e0-4cdf-8175-c288dac24af5" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/practicasdis2.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Main.java" afterDir="false" />
<list default="true" id="0c5e7f40-d6e0-4cdf-8175-c288dac24af5" name="Changes" comment="l">
<change afterPath="$PROJECT_DIR$/src/sdis/utils/MultiMap.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Main.java" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
......@@ -16,11 +14,16 @@
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="master" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 0
}]]></component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 0
}</component>
<component name="ProjectId" id="2gSpcUCtngVFvxbaHNllVLa42oZ" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
......@@ -33,7 +36,14 @@
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "master",
"kotlin-language-version-configured": "true",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"project.structure.last.edited": "Modules",
"project.structure.proportion": "0.0",
"project.structure.side.proportion": "0.0",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
......@@ -53,10 +63,24 @@
<option name="presentableId" value="Default" />
<updated>1715700916232</updated>
<workItem from="1715700917299" duration="37000" />
<workItem from="1715700981339" duration="692000" />
</task>
<task id="LOCAL-00001" summary="l">
<option name="closed" value="true" />
<created>1715701180778</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1715701180778</updated>
</task>
<option name="localTasksCounter" value="2" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="l" />
<option name="LAST_COMMIT_MESSAGE" value="l" />
</component>
</project>
\ No newline at end of file
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
package sdis.spotify.client;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class Cliente {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
//String host = args[0];
String host = "localHost";
String linea;
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
System.out.println("Pulsa <Enter> para comenzar"); System.in.read();
//INICIO Escenario 1
//pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.ADD2L, "010",
// "abc"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.XAUTH,"mal",
"1234"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.XAUTH,"mala",
"124"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.DELETEL,
"010"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.XAUTH,"hector",
"1234"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.ADD2L, "010",
"abc"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.ADD2L, "010",
"aaa"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.ADD2L, "010",
"abcd"));
/*
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.DELETEL,
"112"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.READL,
"112"));*/
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.READL,
"010"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.READL,
"010"));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.DELETEL,
"010")); //Debería devolver Deleted
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.READL,
"010")); //Debería devolver empty
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.DELETEL,
"010")); //Debería devolver Empty
//a estas alguras algún cliente externo debería insertar un mensaje en la cola
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
System.out.println("Pulsa <Enter>"); System.in.read();
}
}
package sdis.spotify.client;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class ClienteInteractivo {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
java.io.BufferedReader tec =
new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
String host = "localHost";
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
//Esto no lo entiendo, creo que no funciona INFO
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
System.out.println("Pulsa <Enter> para comenzar"); //System.in.read();
while((tec.readLine()) != null){
System.out.println("Introduzca la primitiva");
Primitiva primitiva = Primitiva.valueOf(tec.readLine());
System.out.println("Introduzca el parámetro");
String param1 = tec.readLine();
if(primitiva == Primitiva.XAUTH || primitiva == Primitiva.ADD2L){
System.out.println("Introduzca el segundo parámetro");
String param2 = tec.readLine();
pruebaPeticionRespuesta(new MensajeProtocolo(primitiva,param1,param2));
}
else {
pruebaPeticionRespuesta(new MensajeProtocolo(primitiva,param1));
}
}
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
System.out.println("Pulsa <Enter>"); //System.in.read();
}
}
package sdis.spotify.client.unit;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class Add2L {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
if(args.length != 3) {
System.out.println("Use:\njava protocol.cliente.Add2L host clave valor");
System.exit(-1);
}
String host = args[0];
String clave = args[1];
String valor = args[2];
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
//INICIO Escenario 1
//Primero sin loguearse
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.ADD2L, clave, valor));
//Si no está logueado nos devuelve NOTAUTH y si está logueado ADDED
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
}
}
package sdis.spotify.client.unit;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class Auth {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
if(args.length != 3) {
System.out.println("Use:\njava protocol.cliente.Auth host clave valor");
System.exit(-1);
}
String host = args[0];
String clave = args[1];
String valor = args[2];
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
//INICIO Escenario 1
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.XAUTH,clave, valor));
//a estas alguras algún cliente externo debería insertar un mensaje en la cola
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
}
}
package sdis.spotify.client.unit;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class AuthAdd2L {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
if(args.length != 5) {
System.out.println("Use:\njava protocol.cliente.AuthAdd2L host clave valor");
System.exit(-1);
}
String host = args[0];
String clave = args[1];
String valor = args[2];
String clave2 = args[3];
String valor2 = args[4];
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
//INICIO Escenario 1
//Nos debería devolver NOTAUTH
//Ahora nos logueamos y añadimos una canción
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.XAUTH,clave,
valor));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.ADD2L, clave2,
valor2));
//Nos devuelve ADDED
//a estas alguras algún cliente externo debería insertar un mensaje en la cola
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
}
}
package sdis.spotify.client.unit;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class AuthDeleteL {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
if(args.length != 4) {
System.out.println("Use:\njava protocol.cliente.AuthDeleteL host clave valor");
System.exit(-1);
}
String host = args[0];
String clave = args[1];
String valor = args[2];
String clave2 = args[3];
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
//INICIO Escenario 1
//Ahora nos logueamos y borramos una canción
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.XAUTH,clave,
valor));
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.DELETEL, clave2));
//a estas alguras algún cliente externo debería insertar un mensaje en la cola
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
}
}
package sdis.spotify.client.unit;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class DeleteL {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
if(args.length != 2) {
System.out.println("Use:\njava protocol.cliente.DeletL host clave valor");
System.exit(-1);
}
String host = args[0];
String clave = args[1];
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
//INICIO Escenario 1
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.DELETEL, clave));
//Si no existe devuelve EMPTY, si existe devuelve DELETED
//a estas alguras algún cliente externo debería insertar un mensaje en la cola
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
}
}
package sdis.spotify.client.unit;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
public class ReadL {
final private int PUERTO = 2000;
static java.io.ObjectInputStream ois = null;
static java.io.ObjectOutputStream oos = null;
public static void main(String[] args) throws java.io.IOException {
if(args.length != 2) {
System.out.println("Use:\njava protocol.cliente.ReadL host clave valor");
System.exit(-1);
}
String host = args[0];
String clave = args[1];
java.net.Socket sock = new java.net.Socket(host, 2000);
try {
//Creación de los canales de serialización de objetos
oos = new java.io.ObjectOutputStream(sock.getOutputStream());
ois = new java.io.ObjectInputStream(sock.getInputStream());
System.out.println((MensajeProtocolo) ois.readObject()); // Esperando mensaje de bienvenida
//Sin teclado, probemos las primitivas por programa
//INICIO Escenario 1
pruebaPeticionRespuesta(new MensajeProtocolo(Primitiva.READL,
clave));
//a estas alguras algún cliente externo debería insertar un mensaje en la cola
//FIN Esceniario 1
} catch (java.io.EOFException e) {
e.printStackTrace();
System.err.println("sdis.spotify.client.Cliente: Fin de conexión.");
} catch (java.io.IOException e) {
System.err.println("sdis.spotify.client.Cliente: Error de apertura o E/S sobre objetos:"+e);
} catch (MalMensajeProtocoloException e) {
System.err.println("sdis.spotify.client.Cliente: Error mensaje Protocolo: "+e);
} catch (Exception e) {
System.err.println("sdis.spotify.client.Cliente: Excepción. Cerrando Sockets: "+e);
} finally {
ois.close();
oos.close();
sock.close();
}
}
// Prueba una interacción de escritura y lectura con el servidor
static void pruebaPeticionRespuesta(MensajeProtocolo mp) throws
java.io.IOException,
MalMensajeProtocoloException, ClassNotFoundException {
System.out.println("> "+mp);
oos.writeObject(mp);
System.out.println("< "+(MensajeProtocolo) ois.readObject());
}
}
package sdis.spotify.common;
public class MalMensajeProtocoloException extends Exception { }
package sdis.spotify.common;
public class MensajeProtocolo implements java.io.Serializable {
private final Primitiva primitiva;
private final String mensaje;
private final String idCola;
// Constructor para ADDED, EMPTY, DELETED
public MensajeProtocolo(Primitiva p)
throws MalMensajeProtocoloException {
if (p == Primitiva.ADDED || p == Primitiva.EMPTY || p == Primitiva.DELETED) {
this.primitiva = p;
this.mensaje = this.idCola = null;
} else
throw new MalMensajeProtocoloException();
}
// Constructor para XAUTH, NOTAUTH, ERROR, INFO, MEDIA
public MensajeProtocolo(Primitiva p, String mensaje)
throws MalMensajeProtocoloException {
if (p == Primitiva.XAUTH || p == Primitiva.NOTAUTH || p == Primitiva.ERROR || p == Primitiva.INFO || p == Primitiva.MEDIA) {
this.mensaje = mensaje;
this.idCola = null;
} else if (p == Primitiva.READL || p == Primitiva.DELETEL) {
this.idCola = mensaje;
this.mensaje = null;
} else
throw new MalMensajeProtocoloException();
this.primitiva = p;
}
// Constructor para XAUTH, ADD2L
public MensajeProtocolo(Primitiva p, String idCola, String mensaje)
throws MalMensajeProtocoloException {
if (p == Primitiva.XAUTH || p == Primitiva.ADD2L) {
this.primitiva = p;
this.mensaje = mensaje;
this.idCola = idCola;
} else
throw new MalMensajeProtocoloException();
}
public Primitiva getPrimitiva() { return this.primitiva; }
public String getMensaje() { return this.mensaje; }
public String getIdCola() { return this.idCola; }
public String toString() { // prettyPrinter de la clase
switch (this.primitiva) {
case NOTAUTH:
case ERROR:
case INFO:
case MEDIA:
return this.primitiva+":"+this.mensaje ;
case READL:
case DELETEL:
return this.primitiva+":"+this.idCola ;
case ADD2L:
return this.primitiva+":"+this.idCola+":"+this.mensaje ;
case XAUTH:
if(this.idCola != null) {
return this.primitiva + ":" + this.idCola + ":" + this.mensaje;
}else{
return this.primitiva+":"+this.mensaje;
}
default :
return this.primitiva.toString() ;
}
}
}
\ No newline at end of file
package sdis.spotify.common;
public enum Primitiva {
INFO,
XAUTH,
ADD2L,
ADDED,
NOTAUTH,
READL,
MEDIA,
EMPTY,
DELETEL,
DELETED,
ERROR;
}
\ No newline at end of file
package sdis.spotify.common;
public class Strings {
public static final String S_LOGGED = "User successfully logged";
public static final String S_NOTLOGGED = "Err 401 ~ Credentials DO NOT MATCH. Try again";
public static final String S_LOGGEDAGAIN = "User already logged";
public static final String S_WELCOME = "Bienvenid@ a Spotify!!!";
public static final String S_LOGREQ = "User login is required";
public static final String S_ERR_CON = "Err Max Number of connections reached.";
public static final String S_ERR_LOG = "Err Max Number of login attempts reached.";
public static final String S_DEFAULT = "No entiendo protocolo";
}
/**
* Clase que representa el servidor principal para la aplicación de Spotify.
* Este servidor maneja las conexiones entrantes de los clientes.
*/
package sdis.spotify.server;
import sdis.utils.BlacklistManager;
import sdis.utils.MultiMap;
import java.net.InetAddress;
import java.util.concurrent.ConcurrentHashMap;
public class Servidor {
/**
* Método principal que inicia el servidor de Spotify.
* @param args Argumentos de la línea de comandos (no utilizados).
*/
public static void main(String args[]) {
int PUERTO = 2000; // puerto de servicio
int NThreads = 5; // hilos del ThreadPool
// Mapa para almacenar información relacionada con las sesiones de los clientes
MultiMap<String, String> mapa = new MultiMap();
// Pool de hilos para manejar las conexiones entrantes
java.util.concurrent.ExecutorService exec =
java.util.concurrent.Executors.newFixedThreadPool(NThreads);
// ConcurrentHashMap para almacenar datos de inicio de sesión
ConcurrentHashMap<String, String> datosLog = new ConcurrentHashMap<>();
datosLog.put("hector","1234");
datosLog.put("sdis","asdf");
// Administrador de lista negra para conexiones
BlacklistManager conexiones = new BlacklistManager();
// Administrador de lista negra para intentos de inicio de sesión
BlacklistManager attemps = new BlacklistManager();
try {
// Crear un nuevo servidor de socket
java.net.ServerSocket sock = new java.net.ServerSocket(PUERTO);
System.err.println("sdis.spotify.server.Servidor: WHILE [INICIANDO]");
// Thread principal del servidor
Thread mainServer = new Thread(() -> {
try {
while (true) {
java.net.Socket socket = sock.accept();
InetAddress clienteIP = socket.getInetAddress();
String stringIP = clienteIP.toString();
System.out.println("sdis.spotify.client.Cliente conectado desde la IP: " + stringIP);
try {
// Crear un nuevo serviente para manejar la conexión entrante
Sirviente serv =
new Sirviente(socket, mapa, datosLog, conexiones, attemps, stringIP);
exec.execute(serv);
} catch (java.io.IOException ioe) {
System.out.println("sdis.spotify.server.Servidor: WHILE [ERR ObjectStreams]");
}
}
} catch (java.io.IOException ioe) {
System.err.println("sdis.spotify.server.Servidor: WHILE [Error.E/S]");
} catch (Exception e) {
System.err.println("sdis.spotify.server.Servidor: WHILE [Error.execute]");
}
}, "RUN(WHILE)");
// Iniciar el thread principal del servidor
mainServer.start();
System.out.println("sdis.spotify.server.Servidor: [CORRIENDO]");
} catch (java.io.IOException ioe) {
System.out.println("sdis.spotify.server.Servidor: [ERR SSOCKET]");
}
}
}
package sdis.spotify.server;
import sdis.spotify.common.MalMensajeProtocoloException;
import sdis.spotify.common.MensajeProtocolo;
import sdis.spotify.common.Primitiva;
import sdis.spotify.common.Strings;
import sdis.utils.BlacklistManager;
import sdis.utils.MultiMap;
import java.util.concurrent.ConcurrentHashMap;
/**
* Clase que representa un sirviente que maneja la conexión con un cliente.
* Implementa la interfaz Runnable para poder ser ejecutado como un hilo.
*/
class Sirviente implements Runnable {
private final java.net.Socket socket;
private final MultiMap<String, String> mapa;
private final ConcurrentHashMap<String, String> datos;
private final java.io.ObjectOutputStream oos;
private final java.io.ObjectInputStream ois;
private final BlacklistManager conexiones;
private final BlacklistManager attemps;
private final String stringIP;
private boolean registro = false;
private final int ns;
private static java.util.concurrent.atomic.AtomicInteger nInstance=
new java.util.concurrent.atomic.AtomicInteger();
/**
* Constructor de la clase Sirviente.
* @param s Socket de la conexión con el cliente.
* @param c Mapa para almacenar información relacionada con las sesiones de los clientes.
* @param datos ConcurrentHashMap para almacenar datos de inicio de sesión.
* @param conexiones Blacklist para conexiones.
* @param attemps Blacklist para intentos de inicio de sesión.
* @param stringIP Dirección IP del cliente.
* @throws java.io.IOException Si hay un error de E/S.
*/
Sirviente(java.net.Socket s, MultiMap<String, String> c, ConcurrentHashMap<String, String> datos,
BlacklistManager conexiones, BlacklistManager attemps, String stringIP) throws java.io.IOException {
this.socket = s;
this.mapa = c;
this.datos = datos;
this.conexiones = conexiones;
this.attemps = attemps;
this.stringIP = stringIP;
this.ns = nInstance.getAndIncrement();
this.oos = new java.io.ObjectOutputStream(socket.getOutputStream());
this.ois = new java.io.ObjectInputStream(socket.getInputStream());
}
/**
* Método run que se ejecuta cuando se inicia el hilo.
*/
public void run() {
try {
MensajeProtocolo ms;
if (!conexiones.isBlacklisted(stringIP)) {
ms = new MensajeProtocolo(Primitiva.INFO, Strings.S_WELCOME);
oos.writeObject(ms);
conexiones.addCount(stringIP);
while (true) {
String mensaje; // String multipurpose
MensajeProtocolo me = (MensajeProtocolo) ois.readObject();
//me y ms: mensajes entrante y saliente
System.out.println("sdis.spotify.server.Sirviente: " + ns + ": [ME: " + me); // depuracion me
switch (me.getPrimitiva()) {
case XAUTH:
if (!registro) {
if (!attemps.isBlacklisted(stringIP)) {
// Verificar si un par clave-valor está presente
if (datos.containsKey(me.getIdCola())) {
String valorHashMap = datos.get(me.getIdCola());
if (valorHashMap.equals(me.getMensaje())) {
registro = true;
}
}
if (registro) {
ms = new MensajeProtocolo(Primitiva.XAUTH, Strings.S_LOGGED);
} else {
attemps.addCount(stringIP);
ms = new MensajeProtocolo(Primitiva.NOTAUTH, Strings.S_NOTLOGGED);
}
} else {
ms = new MensajeProtocolo(Primitiva.ERROR, Strings.S_ERR_LOG);
}
} else { // No se puede loguear estando logueado
ms = new MensajeProtocolo(Primitiva.ERROR, Strings.S_LOGGEDAGAIN);
}
break;
case ADD2L:
if (registro) {
mapa.push(me.getIdCola(), me.getMensaje());
synchronized (mapa) {
mapa.notify();
} //despierta un sirviente esperando en un bloqueo de "mapa"
ms = new MensajeProtocolo(Primitiva.ADDED);
} else {
ms = new MensajeProtocolo(Primitiva.NOTAUTH, Strings.S_LOGREQ);
}
break;
case READL:
if (null != (mensaje = mapa.pop(me.getIdCola()))) {
ms = new MensajeProtocolo(Primitiva.MEDIA, mensaje);
} else {
ms = new MensajeProtocolo(Primitiva.EMPTY);
}
break;
case DELETEL:
if (registro) {
//Si está registrado, tiene que comprobar que la lista existe o no, no si tiene elementos o no
//Si existe la elimina
if (mapa.contieneClave(me.getIdCola())) {
mapa.eliminarLista(me.getIdCola());
ms = new MensajeProtocolo(Primitiva.DELETED);
} else { //Si no existe devuelve EMPTY
ms = new MensajeProtocolo(Primitiva.EMPTY);
}
} else {
ms = new MensajeProtocolo(Primitiva.NOTAUTH, Strings.S_LOGREQ);
}
break;
default:
ms = new MensajeProtocolo(Primitiva.ERROR, Strings.S_DEFAULT);
} //fin del selector segun el mensaje entrante
oos.writeObject(ms);
//depuracion de mensaje saliente
System.out.println("sdis.spotify.server.Sirviente: " + ns + ": [RESP: " + ms + "]");
}
} else {
ms = new MensajeProtocolo(Primitiva.ERROR, Strings.S_ERR_CON);
oos.writeObject(ms);
}
} catch (java.io.IOException e) {
conexiones.decrementCount(stringIP);
System.err.println("sdis.spotify.server.Sirviente: " + ns + ": [FIN]");
} catch (ClassNotFoundException ex) {
System.err.println("sdis.spotify.server.Sirviente: " + ns + ": [ERR Class not found]");
} catch (MalMensajeProtocoloException ex) {
System.err.println("sdis.spotify.server.Sirviente: " + ns + ": [ERR MalMensajeProtocolo ]");
} finally {
// seguimos deshaciendonos de los sockets y canales abiertos
try {
ois.close();
oos.close();
socket.close();
} catch (Exception x) {
System.err.println("sdis.spotify.server.Sirviente: " + ns + ": [ERR Cerrando sockets]");
}
}
}
}
package sdis.utils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentMap;
public class MultiMap<K, T> {
private final ConcurrentMap<K, ConcurrentLinkedQueue<T>> map = new ConcurrentHashMap<K, ConcurrentLinkedQueue<T>> ();
public void push(K clave, T valor) {
java.util.Queue<T> cola = map.get(clave);
if (null == cola) {
//putIfAbsent es atómica pero requiere "nueva", y es costoso
ConcurrentLinkedQueue<T> nueva = new ConcurrentLinkedQueue<T>();
ConcurrentLinkedQueue<T> previa = map.putIfAbsent(clave, nueva);
cola = (null == previa) ? nueva : previa ;
}
cola.add(valor);
}
public T pop(K clave) {
ConcurrentLinkedQueue<T> cola = map.get(clave);
return (null != cola) ? cola.poll() : null ;
}
public boolean contieneClave(K clave) {
return map.containsKey(clave);
}
public void eliminarLista(K clave) {
map.remove(clave);
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment