From 073028652336f406cb33bbf5b67b5d5b418a71bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 25 Sep 2024 19:50:06 +0200 Subject: [PATCH 01/37] T1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tarea 1 - Programación de Procesos en C --- UA1/tareas/dev_0/ua1tarea1.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/UA1/tareas/dev_0/ua1tarea1.c b/UA1/tareas/dev_0/ua1tarea1.c index 1b2cfd02..33374345 100644 --- a/UA1/tareas/dev_0/ua1tarea1.c +++ b/UA1/tareas/dev_0/ua1tarea1.c @@ -1 +1,34 @@ -Ya os gustaría \ No newline at end of file +#include +#include +#include +int main() +{ + pid_t pid, Padre_pid; + int nota; //Nota es el numero que pediremos despues al usuario + printf ("Introduce un numero\n"); + scanf ("%d", ¬a); //Pedimos el numero con el que trabajaremos mas tarde + + pid = fork(); + //Designamos ambos procesos y el fork creara ambos y hara de pid el proceso padre + + if (pid == -1) //Ha ocurrido un error creando el proceso padre + { + printf ("No se ha podido crear el proceso PADRE"); + exit (-1); + } + + if (pid == 0) //Nos encontramos en el Proceso padre + { + nota-=5;//El proceso padre debe restar 5 y mostrar el resultado + printf("Soy el proceso PADRE:\n\t Mi valor habiendo restando 5 es de %d.\n", + nota); + } + else //Nos encontramos en el proceso hijo + { + wait (NULL); //espera de la finalizacion del proceso padre + nota+=4; //El proceso hijo suma 4 + printf("Soy el proceso HIJO \n\t Mi valor habiendo sumado 4 es de %d.\n", + nota); + } + return(0); +} \ No newline at end of file From 9424159c0af3747396f07fdd7557cb95cbbe1ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 9 Oct 2024 11:28:27 +0200 Subject: [PATCH 02/37] ua1tarea2 --- UA1/tareas/.vscode/c_cpp_properties.json | 18 ++++++ UA1/tareas/.vscode/launch.json | 7 +++ UA1/tareas/.vscode/settings.json | 59 +++++++++++++++++++ .../{dev_0 => dev_22/UA1tarea1}/ua1tarea1.c | 0 UA1/tareas/dev_22/UA1tarea1/ua1tarea1.test.c | 46 +++++++++++++++ .../UA1tarea2/.vscode/c_cpp_properties.json | 18 ++++++ .../dev_22/UA1tarea2/.vscode/launch.json | 24 ++++++++ .../dev_22/UA1tarea2/.vscode/settings.json | 59 +++++++++++++++++++ .../dev_22/UA1tarea2/cadenaCaracteres.java | 39 ++++++++++++ UA1/tareas/dev_22/UA1tarea2/ua1tarea2.java | 59 +++++++++++++++++++ .../tarea_1/ua2tarea1fr1.java | 0 .../tarea_1/ua2tarea1fr2.java | 0 .../{dev_0 => dev_22}/tarea_2/ua2tarea2.java | 0 .../{dev_0 => dev_22}/tarea_3/ua2tarea3.java | 0 ...am_psp_ua4_tarea_2.postman_collection.json | 0 .../tarea_2/BasicHandler.java | 0 .../{dev_0 => dev_22}/tarea_2/DataStore.java | 0 .../{dev_0 => dev_22}/tarea_2/Person.java | 0 .../tarea_2/PersonHandler.java | 0 UA4/tareas/{dev_0 => dev_22}/tarea_2/api.java | 0 UA4/tareas/{dev_0 => dev_22}/tarea_3/conf.ini | 0 21 files changed, 329 insertions(+) create mode 100644 UA1/tareas/.vscode/c_cpp_properties.json create mode 100644 UA1/tareas/.vscode/launch.json create mode 100644 UA1/tareas/.vscode/settings.json rename UA1/tareas/{dev_0 => dev_22/UA1tarea1}/ua1tarea1.c (100%) create mode 100644 UA1/tareas/dev_22/UA1tarea1/ua1tarea1.test.c create mode 100644 UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json create mode 100644 UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json create mode 100644 UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json create mode 100644 UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java create mode 100644 UA1/tareas/dev_22/UA1tarea2/ua1tarea2.java rename UA2/tareas/{dev_0 => dev_22}/tarea_1/ua2tarea1fr1.java (100%) rename UA2/tareas/{dev_0 => dev_22}/tarea_1/ua2tarea1fr2.java (100%) rename UA2/tareas/{dev_0 => dev_22}/tarea_2/ua2tarea2.java (100%) rename UA2/tareas/{dev_0 => dev_22}/tarea_3/ua2tarea3.java (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_2/2_dam_psp_ua4_tarea_2.postman_collection.json (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_2/BasicHandler.java (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_2/DataStore.java (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_2/Person.java (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_2/PersonHandler.java (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_2/api.java (100%) rename UA4/tareas/{dev_0 => dev_22}/tarea_3/conf.ini (100%) diff --git a/UA1/tareas/.vscode/c_cpp_properties.json b/UA1/tareas/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..cea4d3f4 --- /dev/null +++ b/UA1/tareas/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/UA1/tareas/.vscode/launch.json b/UA1/tareas/.vscode/launch.json new file mode 100644 index 00000000..5c7247b4 --- /dev/null +++ b/UA1/tareas/.vscode/launch.json @@ -0,0 +1,7 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [] +} \ No newline at end of file diff --git a/UA1/tareas/.vscode/settings.json b/UA1/tareas/.vscode/settings.json new file mode 100644 index 00000000..bb879da5 --- /dev/null +++ b/UA1/tareas/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/UA1/tareas/dev_0/ua1tarea1.c b/UA1/tareas/dev_22/UA1tarea1/ua1tarea1.c similarity index 100% rename from UA1/tareas/dev_0/ua1tarea1.c rename to UA1/tareas/dev_22/UA1tarea1/ua1tarea1.c diff --git a/UA1/tareas/dev_22/UA1tarea1/ua1tarea1.test.c b/UA1/tareas/dev_22/UA1tarea1/ua1tarea1.test.c new file mode 100644 index 00000000..75eaa012 --- /dev/null +++ b/UA1/tareas/dev_22/UA1tarea1/ua1tarea1.test.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +int main() { + return 0; +} + +void test_handle_input_zero() { + int pipefd[2]; + pipe(pipefd); + pid_t pid = fork(); + + if (pid == 0) { + // Child process + close(pipefd[0]); // Close unused read end + dup2(pipefd[1], STDOUT_FILENO); // Redirect stdout to pipe + close(pipefd[1]); // Close write end after redirect + + // Simulate input value 0 + FILE *input = fopen("input.txt", "w"); + fprintf(input, "0\n"); + fclose(input); + freopen("input.txt", "r", stdin); + + execl("./ua1tarea1", "./ua1tarea1", NULL); + exit(0); + } else { + // Parent process + close(pipefd[1]); // Close unused write end + wait(NULL); // Wait for child process to finish + + char buffer[128]; + read(pipefd[0], buffer, sizeof(buffer)); + close(pipefd[0]); + + // Check output for both parent and child processes + if (strstr(buffer, "Soy el proceso PADRE:\n\t Mi valor habiendo restando 5 es de -5.\n") && + strstr(buffer, "Soy el proceso HIJO \n\t Mi valor habiendo sumado 4 es de -1.\n")) { + printf("Test passed: Correctly handled input value of 0\n"); + } else { + printf("Test failed: Incorrect handling of input value of 0\n"); + } + } +} diff --git a/UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json b/UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..cea4d3f4 --- /dev/null +++ b/UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json b/UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json new file mode 100644 index 00000000..f89e334c --- /dev/null +++ b/UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "c:/Users/franc/Documents/2º DAM/PSP/psp-24-25/UA1/tareas/dev_22/UA1tarea2", + "program": "c:/Users/franc/Documents/2º DAM/PSP/psp-24-25/UA1/tareas/dev_22/UA1tarea2/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json b/UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json new file mode 100644 index 00000000..bb879da5 --- /dev/null +++ b/UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java b/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java new file mode 100644 index 00000000..c95db19b --- /dev/null +++ b/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java @@ -0,0 +1,39 @@ +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class cadenaCaracteres +{ + public static void main(String[] args) { + + InputStreamReader in = new InputStreamReader(System.in); + BufferedReader br = new BufferedReader (in); + + try{ + int salida=0; //Variable para salida de do-while posterior + String texto=""; // para salida de do-while + String lectura; // string lectura + + do{ + + lectura= br.readLine(); //Lee un string entero que está en el buffer, + + + for(int i=0;i{}", liner); + } + } catch (IOException ioe) { + LOGGER.error("Error reading error stream", ioe); + } + } +} diff --git a/UA2/tareas/dev_0/tarea_1/ua2tarea1fr1.java b/UA2/tareas/dev_22/tarea_1/ua2tarea1fr1.java similarity index 100% rename from UA2/tareas/dev_0/tarea_1/ua2tarea1fr1.java rename to UA2/tareas/dev_22/tarea_1/ua2tarea1fr1.java diff --git a/UA2/tareas/dev_0/tarea_1/ua2tarea1fr2.java b/UA2/tareas/dev_22/tarea_1/ua2tarea1fr2.java similarity index 100% rename from UA2/tareas/dev_0/tarea_1/ua2tarea1fr2.java rename to UA2/tareas/dev_22/tarea_1/ua2tarea1fr2.java diff --git a/UA2/tareas/dev_0/tarea_2/ua2tarea2.java b/UA2/tareas/dev_22/tarea_2/ua2tarea2.java similarity index 100% rename from UA2/tareas/dev_0/tarea_2/ua2tarea2.java rename to UA2/tareas/dev_22/tarea_2/ua2tarea2.java diff --git a/UA2/tareas/dev_0/tarea_3/ua2tarea3.java b/UA2/tareas/dev_22/tarea_3/ua2tarea3.java similarity index 100% rename from UA2/tareas/dev_0/tarea_3/ua2tarea3.java rename to UA2/tareas/dev_22/tarea_3/ua2tarea3.java diff --git a/UA4/tareas/dev_0/tarea_2/2_dam_psp_ua4_tarea_2.postman_collection.json b/UA4/tareas/dev_22/tarea_2/2_dam_psp_ua4_tarea_2.postman_collection.json similarity index 100% rename from UA4/tareas/dev_0/tarea_2/2_dam_psp_ua4_tarea_2.postman_collection.json rename to UA4/tareas/dev_22/tarea_2/2_dam_psp_ua4_tarea_2.postman_collection.json diff --git a/UA4/tareas/dev_0/tarea_2/BasicHandler.java b/UA4/tareas/dev_22/tarea_2/BasicHandler.java similarity index 100% rename from UA4/tareas/dev_0/tarea_2/BasicHandler.java rename to UA4/tareas/dev_22/tarea_2/BasicHandler.java diff --git a/UA4/tareas/dev_0/tarea_2/DataStore.java b/UA4/tareas/dev_22/tarea_2/DataStore.java similarity index 100% rename from UA4/tareas/dev_0/tarea_2/DataStore.java rename to UA4/tareas/dev_22/tarea_2/DataStore.java diff --git a/UA4/tareas/dev_0/tarea_2/Person.java b/UA4/tareas/dev_22/tarea_2/Person.java similarity index 100% rename from UA4/tareas/dev_0/tarea_2/Person.java rename to UA4/tareas/dev_22/tarea_2/Person.java diff --git a/UA4/tareas/dev_0/tarea_2/PersonHandler.java b/UA4/tareas/dev_22/tarea_2/PersonHandler.java similarity index 100% rename from UA4/tareas/dev_0/tarea_2/PersonHandler.java rename to UA4/tareas/dev_22/tarea_2/PersonHandler.java diff --git a/UA4/tareas/dev_0/tarea_2/api.java b/UA4/tareas/dev_22/tarea_2/api.java similarity index 100% rename from UA4/tareas/dev_0/tarea_2/api.java rename to UA4/tareas/dev_22/tarea_2/api.java diff --git a/UA4/tareas/dev_0/tarea_3/conf.ini b/UA4/tareas/dev_22/tarea_3/conf.ini similarity index 100% rename from UA4/tareas/dev_0/tarea_3/conf.ini rename to UA4/tareas/dev_22/tarea_3/conf.ini From ffbfdf09d3b81978d1c12d698be1496c10e1a5e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 9 Oct 2024 11:33:07 +0200 Subject: [PATCH 03/37] . --- UA1/tareas/.vscode/c_cpp_properties.json | 18 ------ UA1/tareas/.vscode/launch.json | 7 --- UA1/tareas/.vscode/settings.json | 59 ------------------- .../UA1tarea2/.vscode/c_cpp_properties.json | 18 ------ .../dev_22/UA1tarea2/.vscode/launch.json | 24 -------- .../dev_22/UA1tarea2/.vscode/settings.json | 59 ------------------- 6 files changed, 185 deletions(-) delete mode 100644 UA1/tareas/.vscode/c_cpp_properties.json delete mode 100644 UA1/tareas/.vscode/launch.json delete mode 100644 UA1/tareas/.vscode/settings.json delete mode 100644 UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json delete mode 100644 UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json delete mode 100644 UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json diff --git a/UA1/tareas/.vscode/c_cpp_properties.json b/UA1/tareas/.vscode/c_cpp_properties.json deleted file mode 100644 index cea4d3f4..00000000 --- a/UA1/tareas/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "configurations": [ - { - "name": "windows-gcc-x64", - "includePath": [ - "${workspaceFolder}/**" - ], - "compilerPath": "gcc", - "cStandard": "${default}", - "cppStandard": "${default}", - "intelliSenseMode": "windows-gcc-x64", - "compilerArgs": [ - "" - ] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/UA1/tareas/.vscode/launch.json b/UA1/tareas/.vscode/launch.json deleted file mode 100644 index 5c7247b4..00000000 --- a/UA1/tareas/.vscode/launch.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [] -} \ No newline at end of file diff --git a/UA1/tareas/.vscode/settings.json b/UA1/tareas/.vscode/settings.json deleted file mode 100644 index bb879da5..00000000 --- a/UA1/tareas/.vscode/settings.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "C_Cpp_Runner.cCompilerPath": "gcc", - "C_Cpp_Runner.cppCompilerPath": "g++", - "C_Cpp_Runner.debuggerPath": "gdb", - "C_Cpp_Runner.cStandard": "", - "C_Cpp_Runner.cppStandard": "", - "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", - "C_Cpp_Runner.useMsvc": false, - "C_Cpp_Runner.warnings": [ - "-Wall", - "-Wextra", - "-Wpedantic", - "-Wshadow", - "-Wformat=2", - "-Wcast-align", - "-Wconversion", - "-Wsign-conversion", - "-Wnull-dereference" - ], - "C_Cpp_Runner.msvcWarnings": [ - "/W4", - "/permissive-", - "/w14242", - "/w14287", - "/w14296", - "/w14311", - "/w14826", - "/w44062", - "/w44242", - "/w14905", - "/w14906", - "/w14263", - "/w44265", - "/w14928" - ], - "C_Cpp_Runner.enableWarnings": true, - "C_Cpp_Runner.warningsAsError": false, - "C_Cpp_Runner.compilerArgs": [], - "C_Cpp_Runner.linkerArgs": [], - "C_Cpp_Runner.includePaths": [], - "C_Cpp_Runner.includeSearch": [ - "*", - "**/*" - ], - "C_Cpp_Runner.excludeSearch": [ - "**/build", - "**/build/**", - "**/.*", - "**/.*/**", - "**/.vscode", - "**/.vscode/**" - ], - "C_Cpp_Runner.useAddressSanitizer": false, - "C_Cpp_Runner.useUndefinedSanitizer": false, - "C_Cpp_Runner.useLeakSanitizer": false, - "C_Cpp_Runner.showCompilationTime": false, - "C_Cpp_Runner.useLinkTimeOptimization": false, - "C_Cpp_Runner.msvcSecureNoWarnings": false -} \ No newline at end of file diff --git a/UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json b/UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json deleted file mode 100644 index cea4d3f4..00000000 --- a/UA1/tareas/dev_22/UA1tarea2/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "configurations": [ - { - "name": "windows-gcc-x64", - "includePath": [ - "${workspaceFolder}/**" - ], - "compilerPath": "gcc", - "cStandard": "${default}", - "cppStandard": "${default}", - "intelliSenseMode": "windows-gcc-x64", - "compilerArgs": [ - "" - ] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json b/UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json deleted file mode 100644 index f89e334c..00000000 --- a/UA1/tareas/dev_22/UA1tarea2/.vscode/launch.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "C/C++ Runner: Debug Session", - "type": "cppdbg", - "request": "launch", - "args": [], - "stopAtEntry": false, - "externalConsole": true, - "cwd": "c:/Users/franc/Documents/2º DAM/PSP/psp-24-25/UA1/tareas/dev_22/UA1tarea2", - "program": "c:/Users/franc/Documents/2º DAM/PSP/psp-24-25/UA1/tareas/dev_22/UA1tarea2/build/Debug/outDebug", - "MIMode": "gdb", - "miDebuggerPath": "gdb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ] - } - ] -} \ No newline at end of file diff --git a/UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json b/UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json deleted file mode 100644 index bb879da5..00000000 --- a/UA1/tareas/dev_22/UA1tarea2/.vscode/settings.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "C_Cpp_Runner.cCompilerPath": "gcc", - "C_Cpp_Runner.cppCompilerPath": "g++", - "C_Cpp_Runner.debuggerPath": "gdb", - "C_Cpp_Runner.cStandard": "", - "C_Cpp_Runner.cppStandard": "", - "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", - "C_Cpp_Runner.useMsvc": false, - "C_Cpp_Runner.warnings": [ - "-Wall", - "-Wextra", - "-Wpedantic", - "-Wshadow", - "-Wformat=2", - "-Wcast-align", - "-Wconversion", - "-Wsign-conversion", - "-Wnull-dereference" - ], - "C_Cpp_Runner.msvcWarnings": [ - "/W4", - "/permissive-", - "/w14242", - "/w14287", - "/w14296", - "/w14311", - "/w14826", - "/w44062", - "/w44242", - "/w14905", - "/w14906", - "/w14263", - "/w44265", - "/w14928" - ], - "C_Cpp_Runner.enableWarnings": true, - "C_Cpp_Runner.warningsAsError": false, - "C_Cpp_Runner.compilerArgs": [], - "C_Cpp_Runner.linkerArgs": [], - "C_Cpp_Runner.includePaths": [], - "C_Cpp_Runner.includeSearch": [ - "*", - "**/*" - ], - "C_Cpp_Runner.excludeSearch": [ - "**/build", - "**/build/**", - "**/.*", - "**/.*/**", - "**/.vscode", - "**/.vscode/**" - ], - "C_Cpp_Runner.useAddressSanitizer": false, - "C_Cpp_Runner.useUndefinedSanitizer": false, - "C_Cpp_Runner.useLeakSanitizer": false, - "C_Cpp_Runner.showCompilationTime": false, - "C_Cpp_Runner.useLinkTimeOptimization": false, - "C_Cpp_Runner.msvcSecureNoWarnings": false -} \ No newline at end of file From b59db2afeea933ddb41ddcba49b26b9d42c8bcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 9 Oct 2024 12:01:56 +0200 Subject: [PATCH 04/37] update --- .../dev_22/UA1tarea2/cadenaCaracteres.java | 58 ++++++++---------- UA1/tareas/dev_22/UA1tarea2/ua1tarea2.java | 59 ++----------------- 2 files changed, 28 insertions(+), 89 deletions(-) diff --git a/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java b/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java index c95db19b..8b42e962 100644 --- a/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java +++ b/UA1/tareas/dev_22/UA1tarea2/cadenaCaracteres.java @@ -1,39 +1,29 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; +import java.util.Scanner; -public class cadenaCaracteres -{ - public static void main(String[] args) { +public class CadenaCaracteres extends Thread { - InputStreamReader in = new InputStreamReader(System.in); - BufferedReader br = new BufferedReader (in); - - try{ - int salida=0; //Variable para salida de do-while posterior - String texto=""; // para salida de do-while - String lectura; // string lectura - - do{ - - lectura= br.readLine(); //Lee un string entero que está en el buffer, - - - for(int i=0;i{}", liner); - } - } catch (IOException ioe) { - LOGGER.error("Error reading error stream", ioe); - } +public class ua1tarea2 { + public static void main(String[] args) { + CadenaCaracteres cadena = new CadenaCaracteres(); + cadena.start(); } } From df1b2963aa172b5fd5c6b250d9ded6040e07c893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 9 Oct 2024 19:59:53 +0200 Subject: [PATCH 05/37] tarea3_1 --- UA1/tareas/dev_22/UA1tarea3/Main.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 UA1/tareas/dev_22/UA1tarea3/Main.java diff --git a/UA1/tareas/dev_22/UA1tarea3/Main.java b/UA1/tareas/dev_22/UA1tarea3/Main.java new file mode 100644 index 00000000..69c6ac1c --- /dev/null +++ b/UA1/tareas/dev_22/UA1tarea3/Main.java @@ -0,0 +1,22 @@ + +public class Main { + + public static void main(String[] args) { + System.out.println("Ingresa los argumentos de entrada:"); + + if (args.length < 1) { + System.exit(1); + } + + String argumento = args[0]; + + if (argumento.matches("-?\\d+")) { + int numero = Integer.parseInt(argumento); + if (numero < 0) { + System.exit(3); + } + } else { + System.exit(2); + } + } +} From 10c659f1c34445384e705d723d407f76793a1b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 16 Oct 2024 10:36:09 +0200 Subject: [PATCH 06/37] . --- UA1/tareas/dev_22/ua1tarea3/Argumentos.java | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 UA1/tareas/dev_22/ua1tarea3/Argumentos.java diff --git a/UA1/tareas/dev_22/ua1tarea3/Argumentos.java b/UA1/tareas/dev_22/ua1tarea3/Argumentos.java new file mode 100644 index 00000000..62430082 --- /dev/null +++ b/UA1/tareas/dev_22/ua1tarea3/Argumentos.java @@ -0,0 +1,35 @@ +public class Argumentos { + public static void main(String[] args) { + + if (args.length < 1) { + System.out.println("Error! Por favor ingrese al menos un argumento."); + return; + } + + if { + ProcessBuilder pb = new ProcessBuilder("java", "Main", args[0]); + Process pr = ProcessBuilder.start(); + int exitCode = pr.waitFor(); + + switch (exitCode) { + case 0: + System.out.println("El argumento ingresado es correcto y es entero no negativo."); + break; + case 1: + System.out.println("No hay argumentos."); + break; + case 2: + System.out.println("El argumento ingresado es una cadena."); + break; + case 3: + System.out.println("El argumento ingresado es un numero entero menor a 0."); + break; + default: + System.out.println("Codigo de salida inesperado: " + exitCode); + + } else (Exception e) { + System.out.println("Error iniciando el proceso: " + e.getMessage()); + } + + } +} \ No newline at end of file From ebc8ca5fe4bed56bc8852668d96fa30e94b0636c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 16 Oct 2024 17:39:47 +0200 Subject: [PATCH 07/37] examen --- UA1/examen/dev_22/ua1ex1_teoria.txt | 50 +++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 UA1/examen/dev_22/ua1ex1_teoria.txt diff --git a/UA1/examen/dev_22/ua1ex1_teoria.txt b/UA1/examen/dev_22/ua1ex1_teoria.txt new file mode 100644 index 00000000..e04e8bdd --- /dev/null +++ b/UA1/examen/dev_22/ua1ex1_teoria.txt @@ -0,0 +1,50 @@ +PARTE TEÓRICA + +a) Definición de proceso. Ilustra tu solución con un ejemplo. 1 punto. + + Un proceso es una unidad de ejecución que se ejecuta en un sistema operativo. Y este se ejecuta de una manera determinada, ejemplo de ello sería: + - Abrir un navegador y buscar algo en internet. + + +b) Utilizando tus propias palabras, indica la relación entre hilos y procesos. Ilustra tu solución con un ejemplo. 3 puntos. + + Los procesos son como un paquete de mayor tamaño que en su interior se incluyen los hilos. Por ejemplo: Imaginemos una caja de una mudanza, pues el contenido de su interior + serían los hilos y la caja propiamente dicha, serían los procesos. + + +c) Utilizando tus propias palabras, indica las características de la programación concurrente y sus ámbitos de aplicación. 3 puntos. + + Características: + - Interacción: Los procesos se comunican entre si, e intercambian datos y señales. + - Sincronización: Todos los procesos tienen que actuar de forma coordinada, sin solaparse entre ellos. + - Multitarea: Esto nos permite ejecutar varias tareas al mismo tiempo, sin frenar la ejecución de ninguna de ellas. + + Ámbitos de aplicación: + - Desarrollo de SO: Permite gestionar varios procesos y recursos eficientemente. + - Aplicaciones Web y servidores: Si tenemos una web como por ejemplo un E-Commerce, requerimos de que nuestros clientes se registren, pues para poder llevar a cabo esta tarea + sin complicaciones, de que al recibir distintas peticiones al mismo tiempo, nuestro sistema colapse... pues para esto sirve la programación concurrente. + - Juegos y simulaciones: Al igual que el anterior, permite la la ejecución de múltiples elementos en paralelo. + + + + +d) Utilizando tus propias palabras, indica las diferencias entre programación paralela y programación distribuida, sus ventajas e inconvenientes. 3 puntos. + + La programación paralela está enfocada en la ejecución de tareas en el mismo equipo, mientras que la programación distribuida se enfoca en la ejecución de tareas en diferentes equipos. + + Ventajas: + - Ejecución simultanea y menos tiempo de espera en la ejecución (programación paralela). + - Posibilidad de compartir datos y recursos, además de una mayor flexibilidad y disponibilidad (programación distribuida). + + Desventajas: + - Compiladores y sistemas complejos, mayor consumo de energía y complejidad en los accesos a datos (programación paralela). + - Problemas de comunicación entre equipos, y problemas de seguridad (programación distribuida). + + + + +Notas: + +El nombre del fichero .txt a entregar debe ser: examen\dev_X\ua1ex1_teoria.txt , es decir, el fichero ua1ex1_teoria.txt debe estar ubicado en tu carpeta examen\dev_X\ + +No entregues tu solución, hasta que no se indique por parte del profesorado. \ No newline at end of file From 8c3d52a07deffb6806cd560c534a80e155431e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 16 Oct 2024 19:00:08 +0200 Subject: [PATCH 08/37] . --- .vscode/settings.json | 59 +++++++++++++++++++++++++++++++ UA1/examen/dev_22/ua1ex1p1c.c | 66 +++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 UA1/examen/dev_22/ua1ex1p1c.c diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..bb879da5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/UA1/examen/dev_22/ua1ex1p1c.c b/UA1/examen/dev_22/ua1ex1p1c.c new file mode 100644 index 00000000..d20ca462 --- /dev/null +++ b/UA1/examen/dev_22/ua1ex1p1c.c @@ -0,0 +1,66 @@ +/* +PARTE PRÁCTICA 1/2 + +FR1: Haz un programa en C que genere una estructura de procesos con un PADRE y 3 HIJOS, del mismo padre se entiende - 2 puntos +FR2: Visualiza por cada hijo su identificador (si es el hijo 1, 2 ó 3), su PID y el del padre, utilizando para ello una función definida por ti a la que llamen los procesos hijos - 2 puntos +FR3: Justo antes de finalizar el programa PADRE, se debe imprimir por pantalla el PID del padre de todos una única vez. Debe hacerlo el programa PADRE - 2 puntos +FR4: Implementa el control de errores - 2 puntos +FR5: Documenta y estructura el código - 2 puntos + + +Para evitar complicaciones con máquinas virtuales, si lo prefieres puedes utilizar el compilador online: https://www.onlinegdb.com/online_c_compiler + +Notas: + +Los comentarios (descriptivos y concisos) en el código ... siempre son bien. +Los nombres de las variables autodescriptivos ... siempre son bien. +Las impresión por pantalla, correctamente indentada y verticalmente espaciada ... siempre es bien. +Los warnings del presente ... son los errores del futuro. +El nombre del fichero .c a entregar debe ser: examen\dev_X\ua1ex1p1.c , es decir, el fichero ua1ex1.cdebe estar ubicado en tu carpeta dev_X\ + +No entregues tu solución, hasta que no se indique por parte del profesorado. +*/ + +#include +#include +#include + + +void hijos (int id) { + pid_t Padre_pid = getppid(); + pid_t pid = getpid(); + hijos(id); + printf("Hijo %d = \n Pid padre %d: Pid hijo %d: \n ", id, Padre_pid, pid); + } + +int main() +{ + int pid1, pid2, pid3; + + pid1 = fork(); + + if (pid1 == 0) + { + hijos(1); + exit(0); + } + + pid2 = fork(); + + if (pid2 == 0) + { + hijos(2); + exit(0); + } + + pid3 = fork(); + + if (pid3 == 0) + { + hijos(3); + exit(0); + } + + return 0; +} + From 2c5111a3a1574b5e76c06631b99450d3a4a46f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 16 Oct 2024 19:58:32 +0200 Subject: [PATCH 09/37] . --- .../dev_22/ejercicio2/EstadoPlantas.java | 21 +++++++ UA1/examen/dev_22/ejercicio2/Humedad.java | 20 +++++++ UA1/examen/dev_22/ejercicio2/Temperatura.java | 23 ++++++++ UA1/examen/dev_22/ejercicio2/ua1ex1p2.java | 56 +++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 UA1/examen/dev_22/ejercicio2/EstadoPlantas.java create mode 100644 UA1/examen/dev_22/ejercicio2/Humedad.java create mode 100644 UA1/examen/dev_22/ejercicio2/Temperatura.java create mode 100644 UA1/examen/dev_22/ejercicio2/ua1ex1p2.java diff --git a/UA1/examen/dev_22/ejercicio2/EstadoPlantas.java b/UA1/examen/dev_22/ejercicio2/EstadoPlantas.java new file mode 100644 index 00000000..0fb3a9f7 --- /dev/null +++ b/UA1/examen/dev_22/ejercicio2/EstadoPlantas.java @@ -0,0 +1,21 @@ +public class EstadoPlantas extends Thread{ + private int detector; + public EstadoPlantas() { + detector = (int) (Math.random() * 5); + } + + @Override + public void run() { + try { + Thread.sleep((long) (Math.random() * 3000 + 1000)); // Esperar un tiempo aleatorio entre 1 y 3 segundos + } catch (InterruptedException e) { + e.printStackTrace(); + } + double medicion = Math.random() * 100; // Generar una medición aleatoria entre 0 y 100 + long tiempo = System.currentTimeMillis(); // Obtener el tiempo actual en milisegundos + System.out.printf("Sensor Estado de las plantas nº %d: Medición %.2f, Tiempo: %d%n", detector, medicion, tiempo); + } + + + +} diff --git a/UA1/examen/dev_22/ejercicio2/Humedad.java b/UA1/examen/dev_22/ejercicio2/Humedad.java new file mode 100644 index 00000000..c99a5917 --- /dev/null +++ b/UA1/examen/dev_22/ejercicio2/Humedad.java @@ -0,0 +1,20 @@ +public class Humedad extends Thread { + private double humedad; + + public Humedad() { + this.humedad = Math.random() * 100; // Valor aleatorio recogido por el sensor + } + + @Override + public void run() { + try { + Thread.sleep((long) (Math.random() * 2000) + 1000); // Duerme entre 1 y 3 segundos + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println("Sensor de humedad: " + humedad + " % - Lectura realizada en " + System.currentTimeMillis()); + } + + +} diff --git a/UA1/examen/dev_22/ejercicio2/Temperatura.java b/UA1/examen/dev_22/ejercicio2/Temperatura.java new file mode 100644 index 00000000..36652580 --- /dev/null +++ b/UA1/examen/dev_22/ejercicio2/Temperatura.java @@ -0,0 +1,23 @@ +public class Temperatura extends Thread { + private String sensor; + + public Temperatura(String sensor) { + this.sensor = sensor; + + } + + @Override + public void run() { + while (true) { + double temperatura = (Math.random() * 50) + 1; + try { + Thread.sleep((long) (Math.random() * 3000 + 1000)); // Esperar un tiempo aleatorio entre 1 y 3 segundos + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.printf("%s de temperatura: %.2f grados Celsius, leída en %d ms%n", sensor, temperatura, System.currentTimeMillis()); + } + } + +} diff --git a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java new file mode 100644 index 00000000..15b1ddbc --- /dev/null +++ b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java @@ -0,0 +1,56 @@ +/* +PARTE PRÁCTICA 2/2 + +Se ha decidido implantar un huerto en un centro público, y se han instalado varios sensores ESP32 para monitorizar la temperatura, la humedad del suelo y el estado de las plantas en distintas áreas del huerto. Se requiere un sistema en Java que simule la lectura de estos sensores de manera concurrente para obtener los datos en tiempo real. + +Tu tarea es diseñar una solución que simule el monitoreo de estos sensores usando hilos en Java. El sistema debe realizar lo siguiente: + +Crear tres hilos para simular los sensores: uno para la temperatura, otro para la humedad del suelo y otro para el estado de las plantas. + +Cada sensor (hilo) debe: + +Generar un valor aleatorio para la medición correspondiente. +Dormir durante un tiempo aleatorio entre 1 y 3 segundos para simular la espera entre lecturas. +Imprimir el valor generado con un mensaje que indique qué sensor hizo la lectura y en qué momento (puedes usar System.currentTimeMillis() para esto). +Los datos de los sensores deben ser leídos de manera concurrente. + +El programa debe ejecutarse durante 10 ciclos de medición (10 iteraciones por sensor). + +Mejora opcional: Implementa una forma de detener todos los sensores después de que hayan hecho las 10 lecturas. + +Funcionalidades Requeridas (FR): +FR1 (2 puntos): Crear un hilo para cada sensor (temperatura, humedad y estado de las plantas). +FR2 (2 puntos): Generar valores aleatorios para cada medición de sensor. +FR3 (2 puntos): Simular la espera de tiempo entre lecturas con Thread.sleep(). +FR4 (2 puntos): Mostrar las lecturas de cada sensor con su correspondiente marca de tiempo. +FR5 (2 puntos): Ejecutar correctamente los 10 ciclos de medición por cada sensor. + +*/ + + + +public class ua1ex1p2 { + public static void main(String[] args) { + + for (int i = 0; i < 10; i++) { // Bucle para que realice 10 ciclos + + Temperatura sensor1 = new Temperatura("Sensor 1"); + sensor1.start(); + + + Humedad humedadThread = new Humedad(); + humedadThread.start(); + + EstadoPlantas detector1 = new EstadoPlantas(); + detector1.start(); + + + try { + Thread.sleep(5000); // Obligo a que cuando finalice un ciclo, espere 5 segundos hasta inciar otro + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + } +} \ No newline at end of file From 9e802314f71fb37fdfdbecbac922032f7a4a0ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 23 Oct 2024 19:30:40 +0200 Subject: [PATCH 10/37] cambio pull request MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no se me ocurria nada que hacerle, y le he añadido un print al final del main --- UA1/examen/dev_22/ejercicio2/ua1ex1p2.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java index 15b1ddbc..be05c8af 100644 --- a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java +++ b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java @@ -52,5 +52,7 @@ public static void main(String[] args) { } } + System.out.println("Todos los sensores han finalizado."); + } } \ No newline at end of file From 7c3b8ea1154480434c3032093b5fa231fe2a2fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 23 Oct 2024 19:33:37 +0200 Subject: [PATCH 11/37] cambio --- UA1/examen/dev_22/ejercicio2/ua1ex1p2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java index be05c8af..c32e87ec 100644 --- a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java +++ b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java @@ -52,7 +52,7 @@ public static void main(String[] args) { } } - System.out.println("Todos los sensores han finalizado."); + } } \ No newline at end of file From cd39fc9e8497290afccc739abf00f8491a74f195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 23 Oct 2024 19:35:52 +0200 Subject: [PATCH 12/37] pull request No se me ocurria nada a cambiar y he puesto un print al final del main --- UA1/examen/dev_22/ejercicio2/ua1ex1p2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java index c32e87ec..be05c8af 100644 --- a/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java +++ b/UA1/examen/dev_22/ejercicio2/ua1ex1p2.java @@ -52,7 +52,7 @@ public static void main(String[] args) { } } - + System.out.println("Todos los sensores han finalizado."); } } \ No newline at end of file From 2a0084c076d2d7ffaa9e89fdf05c5a93ad173d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 11 Dec 2024 16:55:29 +0100 Subject: [PATCH 13/37] Create ua1ex1.txt --- UA2/examen/ejercicio1/dev_22/ua1ex1.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 UA2/examen/ejercicio1/dev_22/ua1ex1.txt diff --git a/UA2/examen/ejercicio1/dev_22/ua1ex1.txt b/UA2/examen/ejercicio1/dev_22/ua1ex1.txt new file mode 100644 index 00000000..e69de29b From bc77065ce994a80d23e20e55d16d163cd7be6b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 11 Dec 2024 17:31:59 +0100 Subject: [PATCH 14/37] ex1 teorico --- UA2/examen/ejercicio1/dev_22/ua1ex1.txt | 88 +++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/UA2/examen/ejercicio1/dev_22/ua1ex1.txt b/UA2/examen/ejercicio1/dev_22/ua1ex1.txt index e69de29b..757cb80e 100644 --- a/UA2/examen/ejercicio1/dev_22/ua1ex1.txt +++ b/UA2/examen/ejercicio1/dev_22/ua1ex1.txt @@ -0,0 +1,88 @@ +Conceptos básicos sobre hilos (1 punto): + +a) Define qué es un hilo en Java y cómo se relaciona con la multitarea. + + Un hilo en Java es como una tarea, la cual, nos ayuda al funcionamiento de la multitarea, o mejor dicho, el multihilo. + Esta tarea funciona en segundo plano, mientras que el main corre en primer plano, también puede no ejecutarse en segundo plano + si la bloqueas con un sleep. + + +b) Menciona dos diferencias entre la interfaz Runnable y la clase Thread. + + La clase Thread, es una clase la cual extiende de un hilo, este se marca con "extend Thread", + mientras que la interfaz Runnable, es una interfaz la cual se marca con "implement Runnable. + + Otra diferencia sería que la clase Thread, se le puede implementar un método run(), mientras que en la + Runnable, no. + +Sincronización (1 punto): + +a) Explica qué es la sincronización de hilos y por qué es necesaria en Java. + + La sincronización de hilos se puede conseguir con una función denomida, por ejemplo, "public synchronized void", + esta función, no permite que dos hilos accedan a la misma variable al mismo tiempo, sino que, obliga a que + uno termine su ejecución para que el otro pueda proceder a la suya, dando así un resultado, pues más correcto. + + Un ejemplo sería una práctica que hicimos de agregar dinero a un banco, algo por el estilo, y por ejemplo, se podía ver + como, cuando no añadías el synchronized, las introducciones de dinero y salidas actuaban como querían, mientras que al ponerlo + estas eran como más secuenciales, es decir, aparecía primero dinero en el banco, luego el ingreso y finalmente el total. + + + +b) ¿Qué problemas pueden surgir si no se sincronizan adecuadamente los hilos? + + Como he comentando anteriormente, si no se sincronizan adecuadamente los hilos, se pueden producir problemas como, + por ejemplo, que el dinero de las salidas y entradas pues no salgan correctamente, sino que van como quieren sin respetar un orden + ya que no espera a que acabe un hilo para que empiece otro. + + + +Estados de un hilo (1 punto): + +a) Nombra y describe brevemente los principales estados de un hilo en su ciclo de vida. + + El ciclo de vida sería: + 1. Creacion del hilo. + 2. Ejecucion del mismo. + 3. Pausa del hilo (si se desea). + 4. Muerte del hilo. + + + +b) ¿Qué método en Java se utiliza para pausar un hilo por un tiempo específico? + + Para pausar un hilo se puede usar un sleep, el método sería "Thread.sleep()" y entre paréntesis pones los milisegundos + que quieras que este se frene, por ejemplo si son 3 segundos, pues al cambio serían 3000 milisegundos. + + + +Bloques sincronizados y monitores (1 punto): + +a) ¿Qué es un monitor en Java? + + +b) Explica cómo se utiliza el bloque synchronized para garantizar acceso exclusivo a un recurso. + + Se pone el synchronized antes de la función que se quiere que sea exclusiva, por ejemplo, "public synchronized void ". + + +Métodos avanzados en hilos (1 punto): + +a) ¿Qué diferencia existe entre los métodos wait(), notify(), y notifyAll() en Java? + + Los métodos wait(), notify() y notifyAll() son utilizados para hacer que un hilo, espere a ser avisado por otro, + para que pueda seguir con su ejecución. El método wait() hace que el propio hilo espere a ser notificado, el método notify() + notifica a otro hilo para que este se ejecute y por último, el método notifyAll() notifica a todos los hilos que estén esperando. + +b) Explica un caso práctico donde utilizarías estos métodos para resolver un problema de concurrencia. + + Quiero simular el tipico movil o cacharro de los bares para mandar la comanda a cocina, para ello, se necesita que el hilo + el cual se encarga de mandar la comanda, espere a que el hilo que se encarga del pedido termine, para que pueda seguir con + la comanda, pues para eso usaria el método wait(), el cual, me va a hacer que el hilo que se encarga del pedido termine, + para que pueda seguir con la comanda, y el método notify(), para que el hilo que se encarga de la comanda, pueda proceder a + su ejecución. + + Y el metodo notifyAll(), pues en este ejemplo no me serviría, pero si alomejor necesitara que en vez de que vaya a cocina + vaya tambíen a la barra, pues puede ser que en vez de utilizar notify() a secas, usara notifyAll(). + + From 501743b0dd2c078daf465d8394e167a61409d451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 11 Dec 2024 19:52:02 +0100 Subject: [PATCH 15/37] Create ua2ex2.java --- .../ejercicio2/dev_22/ua2ex2/src/ua2ex2.java | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java diff --git a/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java b/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java new file mode 100644 index 00000000..ccaaa305 --- /dev/null +++ b/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java @@ -0,0 +1,162 @@ +/** + * @file ua2ex2.java + * + * @brief Aplicacion q produce y consume caracteres almacenados en un array + * + * Esta aplicacion alamacenará un array de los caracteres producidos por la clase Productor + * en otra clase Buffer, y la clase Consumidor, se dedicará a extraerlos y procesarlos. + */ + + + + +import java.util.Random; + +/** + * @brief Almacena el array de caracteres + * + * Recibe el caracter producido por la clase Productor y lo almacena, + * como máximo almacenará 10 caracteres, ya que asi se ha establecido en + * la Aplicacion Principal (ua2ex2). + * + * @class Buffer + */ + +class Buffer { + + private char[] buffer; + private int capacidad; + private int indiceEscritura = 0; + private int indiceLectura = 0; + private int contador = 0; + + /** + * @brief El constructor sirve para inicializar el buffer con una capacidad (la cual se especifica en ua2ex2). + * + * @param capacidad es el tamaño máximo del buffer (mas adelante se verá q es 10) + */ + + public Buffer(int capacidad) { + this.capacidad = capacidad; + this.buffer = new char[capacidad]; + } + + /** + * @brief Añade un caracter al buffer si hay espacio disponible y espera si este está lleno. + * + * @param c es la variable que se añadirá al buffer + * + */ + + public synchronized void producir(char c) throws InterruptedException { + while (!(contador == capacidad)) { + buffer[indiceEscritura] = c; + indiceEscritura = (indiceEscritura + 1) % capacidad; + contador++; + System.out.println(indiceEscritura + ". Se ha añadido un caracter: " + c + " y la capacidad actual de la cola está en: " + contador + "/" + capacidad ); + notifyAll(); + } + wait(); + } + + /** + * @brief Extrae un carácter del buffer si hay elementos disponibles y espera si este está lleno. + * + * @return Devuelve el caracter extraído del buffer + */ + + public synchronized char consumir() throws InterruptedException { + char c = buffer[indiceLectura]; + while (!(contador == 0)) { + indiceLectura = (indiceLectura + 1) % capacidad; + contador--; + System.out.println(indiceLectura + ". Se ha eliminado un caracter: " + c + " y la capacidad actual de la cola está en: " + contador + "/" + capacidad ); + notifyAll(); + + } + wait(); + + return c; + } +} + +/** + * @brief Genera caracteres aleatorios + * + * La clase Productor simula un hilo que genera caracteres aleatorios desde la A-Z y los almacena en el buffer. + * + * @class Productor + */ + + +class Productor extends Thread { + + private Buffer buffer; + private Random random = new Random(); + + /** + * @brief El constructor sirve para inicializar el Productor haciendo referencia al Buffer compartido. + * + * @param buffer que es el objeto buffer compartido anterior + */ + + public Productor (Buffer buffer){ + this.buffer = buffer; + + } + + /** + * @brief El método run genera caracteres aleatorios y los añade al buffer y espera un tiempo aleatorio entre 200 ms y 500 ms. + * + */ + + @Override + public void run(){ + try { + char c = (char) (Math.random()*26+'A'); + buffer.producir(c); + Thread.sleep(random.nextInt(200)+300); + + + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + } +} + +class Consumidor extends Thread{ + + private Buffer buffer; + private Random random = new Random(); + + public Consumidor(Buffer buffer) { + this.buffer = buffer; + + } + + @Override + public void run(){ + try { + buffer.consumir(); + Thread.sleep(random.nextInt(300)+400); + + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + } +} + + +public class ua2ex2 { + public static void main(String[] args) { + Buffer buffer = new Buffer(10); + Productor productor = new Productor(buffer); + Consumidor consumidor = new Consumidor(buffer); + + productor.start(); + consumidor.start(); + + } +} From 1bca39f6efbb2753303ff1ca6b4aef29bb1c9336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20David=20Vela=20Castro?= Date: Thu, 12 Dec 2024 18:36:39 +0100 Subject: [PATCH 16/37] Update ua2ex2.java --- .../ejercicio2/dev_22/ua2ex2/src/ua2ex2.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java b/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java index ccaaa305..b9791f6b 100644 --- a/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java +++ b/UA2/examen/ejercicio2/dev_22/ua2ex2/src/ua2ex2.java @@ -1,3 +1,26 @@ +/** +Feedback JD: 12/12/2024 +Buen trabajo Francisco. + +Problemas y áreas de mejora: + +Condiciones de espera mal aplicadas: + En producir, el bucle while (!(contador == capacidad)) nunca permite a los productores esperar; debería ser while (contador == capacidad). + Lo mismo ocurre en consumir, donde while (!(contador == 0)) debe cambiar a while (contador == 0). + Esto genera un comportamiento inesperado donde wait() no se invoca en las condiciones adecuadas. + +Errores de flujo en los métodos: + wait() se ejecuta fuera del bucle, lo que puede generar fallos o un comportamiento indefinido si el estado del buffer cambia antes de la espera. + +Producción/consumo único por ejecución: + Los métodos producir y consumir no están diseñados para trabajar en un bucle continuo dentro del hilo (e.g., producción/consumo repetitiva), limitando el propósito del programa. + +Falta de control de excepciones robusto: + Las excepciones son manejadas con un RuntimeException, lo cual no proporciona suficiente información para depuración en un entorno real. + + +**/ + /** * @file ua2ex2.java * From eabba07646c4bfe7297175e5040275cf7f0642eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Mon, 13 Jan 2025 14:59:41 +0100 Subject: [PATCH 17/37] tarea3 --- UA3/tareas/dev_22/ua3tarea1.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea1.java diff --git a/UA3/tareas/dev_22/ua3tarea1.java b/UA3/tareas/dev_22/ua3tarea1.java new file mode 100644 index 00000000..1351a8b6 --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea1.java @@ -0,0 +1,25 @@ +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Scanner; + +public class ua3tarea1 { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + String entrada; + + do { + System.out.print("Ingrese una IP o URL (o 'localhost' para salir): "); + entrada = scanner.nextLine(); + + try { + InetAddress address = InetAddress.getByName(entrada); + System.out.println("Nombre de host: " + address.getHostName()); + System.out.println("Dirección IP: " + address.getHostAddress()); + } catch (UnknownHostException e) { + System.out.println("No se pudo resolver la dirección: " + entrada); + } + } while ("localhost".equalsIgnoreCase(entrada)); + System.out.println("Saliendo del programa...."); + scanner.close(); + } +} \ No newline at end of file From 752190cd0e82acf6254976253ea1c2fbac99e6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:18:14 +0100 Subject: [PATCH 18/37] Create ua3tarea2servidor.java --- UA3/tareas/dev_22/ua3tarea2servidor.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea2servidor.java diff --git a/UA3/tareas/dev_22/ua3tarea2servidor.java b/UA3/tareas/dev_22/ua3tarea2servidor.java new file mode 100644 index 00000000..d2a8fc1a --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea2servidor.java @@ -0,0 +1,20 @@ +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class Servidores { + + public static void main(String[] arg) throws IOException { + int Puerto = 6000;// Puerto + ServerSocket Servidor = new ServerSocket(Puerto); + System.out.println("Escuchando en " + Servidor.getLocalPort()); + + Socket cliente1 = Servidor.accept(); + // Realizar Acciones con cliente 1 + + Socket cliente2 = Servidor.accept(); + // Realizar Acciones con cliente 2 + + Servidor.close(); + } +} From 205f4531ac15a0373af15dcdc9ad2e1f3fa35658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 22 Jan 2025 17:18:44 +0100 Subject: [PATCH 19/37] Create ua3tarea2cliente.java --- UA3/tareas/dev_22/ua3tarea2cliente.java | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea2cliente.java diff --git a/UA3/tareas/dev_22/ua3tarea2cliente.java b/UA3/tareas/dev_22/ua3tarea2cliente.java new file mode 100644 index 00000000..3f978f66 --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea2cliente.java @@ -0,0 +1,31 @@ +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; + +public class Clientes { + public static void main(String[] arg) throws IOException { + String Host = "localhost"; + int Puerto = 6000;// Puerto + + Socket Cliente = new Socket(Host, Puerto); + InetAddress i = Cliente.getInetAddress(); + System.out.println("\n Cliente 1"); + System.out.println("\n Puerto Local: " + Cliente.getLocalPort()); + System.out.println(" Puerto Remoto: " + Cliente.getPort()); + System.out.println(" Nombre Host/IP: " + Cliente.getInetAddress()); + System.out.println(" Host Remoto: " + i.getHostName().toString()); + System.out.println(" IP Host Remoto: " + i.getHostAddress().toString()); + + Cliente.close(); + + Socket Cliente2 = new Socket(Host, Puerto); + InetAddress n = Cliente.getInetAddress(); + System.out.println("\n Cliente 2"); + System.out.println("\n Puerto Local: " + Cliente.getLocalPort()); + System.out.println(" Puerto Remoto: " + Cliente.getPort()); + System.out.println(" Nombre Host/IP: " + Cliente.getInetAddress()); + System.out.println(" Host Remoto: " + i.getHostName().toString()); + System.out.println(" IP Host Remoto: " + i.getHostAddress().toString()); + } + +} From dd2913dc9645bbda142dee3108f97a2a54a088c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:59:30 +0100 Subject: [PATCH 20/37] Create ua3tarea3servidor.java --- UA3/tareas/dev_22/ua3tarea3servidor.java | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea3servidor.java diff --git a/UA3/tareas/dev_22/ua3tarea3servidor.java b/UA3/tareas/dev_22/ua3tarea3servidor.java new file mode 100644 index 00000000..0ed824c1 --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea3servidor.java @@ -0,0 +1,26 @@ +import java.io.*; +import java.net.*; + +public class Servidor { + public static void main(String[] args) { + try (ServerSocket serverSocket = new ServerSocket(12345)) { + System.out.println("El servidor esta leyendo en el puerto 12345"); + while (true) { + try (Socket socket = serverSocket.accept()) { + BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); + PrintWriter output = new PrintWriter(socket.getOutputStream(), true); + + String mensaje = input.readLine(); + String mensajeMayus = mensaje.toUpperCase(); + output.println(mensajeMayus); + } catch (IOException e) { + System.out.println("Excepcion del servidor: " + e.getMessage()); + e.printStackTrace(); + } + } + } catch (IOException e) { + System.out.println("No se ha podido leer a traves del puerto 12345"); + e.printStackTrace(); + } + } +} From af91f1c45098e2faac1d5da72bb52591095677a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:00:12 +0100 Subject: [PATCH 21/37] Create ua3tarea3cliente.java --- UA3/tareas/dev_22/ua3tarea3cliente.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea3cliente.java diff --git a/UA3/tareas/dev_22/ua3tarea3cliente.java b/UA3/tareas/dev_22/ua3tarea3cliente.java new file mode 100644 index 00000000..102a51b8 --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea3cliente.java @@ -0,0 +1,25 @@ +import java.io.*; +import java.net.*; +import java.util.Scanner; + +public class Cliente { + public static void main(String[] args) { + try (Socket socket = new Socket("localhost", 12345)) { + PrintWriter output = new PrintWriter(socket.getOutputStream(), true); + BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); + Scanner scanner = new Scanner(System.in); + + System.out.print("Inserte un mensaje: "); + String mensaje = scanner.nextLine(); + output.println(mensaje); + + String respuesta = input.readLine(); + System.out.println("Servidor: " + respuesta); + } catch (UnknownHostException e) { + System.out.println("El servidor no ha sido encontrado: " + e.getMessage()); + } catch (IOException e) { + System.out.println("I/O error: " + e.getMessage()); + + } + } +} From 718d4edd48f46d7c713a8ffa69c48faf69c595a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:53:48 +0100 Subject: [PATCH 22/37] Create ua3tarea4servidor.java --- UA3/tareas/dev_22/ua3tarea4servidor.java | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea4servidor.java diff --git a/UA3/tareas/dev_22/ua3tarea4servidor.java b/UA3/tareas/dev_22/ua3tarea4servidor.java new file mode 100644 index 00000000..3a8282ac --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea4servidor.java @@ -0,0 +1,32 @@ +import java.io.*; +import java.net.*; + +public class Servidor { + public static void main(String[] args) { + try (ServerSocket serverSocket = new ServerSocket(12345)) { + System.out.println("El servidor esta leyendo en el puerto 12345"); + while (true) { + try (Socket socket = serverSocket.accept()) { + BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); + PrintWriter output = new PrintWriter(socket.getOutputStream(), true); + + String mensaje; + while ((mensaje = input.readLine()) != null) { + if ("*".equals(mensaje)) { + System.out.println("Recibido asterisco, cerrando conexión con el cliente."); + break; + } + String mensajeMayus = mensaje.toUpperCase(); + output.println(mensajeMayus); + } + } catch (IOException e) { + System.out.println("Excepcion del servidor: " + e.getMessage()); + e.printStackTrace(); + } + } + } catch (IOException e) { + System.out.println("No se ha podido leer a traves del puerto 12345"); + e.printStackTrace(); + } + } +} From 0c9392425de6c6ffa50a63c3675de74449498dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:54:15 +0100 Subject: [PATCH 23/37] Create ua3tarea4cliente.java --- UA3/tareas/dev_22/ua3tarea4cliente.java | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 UA3/tareas/dev_22/ua3tarea4cliente.java diff --git a/UA3/tareas/dev_22/ua3tarea4cliente.java b/UA3/tareas/dev_22/ua3tarea4cliente.java new file mode 100644 index 00000000..a3d2e635 --- /dev/null +++ b/UA3/tareas/dev_22/ua3tarea4cliente.java @@ -0,0 +1,32 @@ +import java.io.*; +import java.net.*; +import java.util.Scanner; + +public class Cliente { + public static void main(String[] args) { + try (Socket socket = new Socket("localhost", 12345)) { + PrintWriter output = new PrintWriter(socket.getOutputStream(), true); + BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); + Scanner scanner = new Scanner(System.in); + + String mensaje; + while (true) { + System.out.print("Inserte un mensaje: "); + mensaje = scanner.nextLine(); + output.println(mensaje); + + if ("*".equals(mensaje)) { + System.out.println("Cerrando conexión con el servidor."); + break; + } + + String respuesta = input.readLine(); + System.out.println("Servidor: " + respuesta); + } + } catch (UnknownHostException e) { + System.out.println("El servidor no ha sido encontrado: " + e.getMessage()); + } catch (IOException e) { + System.out.println("I/O error: " + e.getMessage()); + } + } +} From f5c06b50917fe5e2b7c2f73eddef8c74a595bfc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:52:34 +0100 Subject: [PATCH 24/37] Create Miembro1.java --- UA3/actividad/team_0/Miembro1.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 UA3/actividad/team_0/Miembro1.java diff --git a/UA3/actividad/team_0/Miembro1.java b/UA3/actividad/team_0/Miembro1.java new file mode 100644 index 00000000..5a95c914 --- /dev/null +++ b/UA3/actividad/team_0/Miembro1.java @@ -0,0 +1,12 @@ +import java.net.InetAddress; + +public class Miembro1 extends MiembroToken { + public Miembro1() throws Exception { + super(10000, 1, true, false, InetAddress.getByName("localhost"), 10001, 1); + } + + public static void main(String[] args) throws Exception { + Miembro1 miembro1 = new Miembro1(); + miembro1.start(); + } +} From 752843414d714a2a34b3f85cae317943af939031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:53:02 +0100 Subject: [PATCH 25/37] Create Miembro2.java --- UA3/actividad/team_0/Miembro2.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 UA3/actividad/team_0/Miembro2.java diff --git a/UA3/actividad/team_0/Miembro2.java b/UA3/actividad/team_0/Miembro2.java new file mode 100644 index 00000000..b59763b2 --- /dev/null +++ b/UA3/actividad/team_0/Miembro2.java @@ -0,0 +1,12 @@ +import java.net.InetAddress; + +public class Miembro2 extends MiembroToken { + public Miembro2() throws Exception { + super(10001, 2, false, false, InetAddress.getByName("localhost"), 10002, 2); + } + + public static void main(String[] args) throws Exception { + Miembro2 miembro2 = new Miembro2(); + miembro2.start(); + } +} From 19c59c7a6a354fa87b82c87026da5841d635517c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:53:25 +0100 Subject: [PATCH 26/37] Create Miembro3.java --- UA3/actividad/team_0/Miembro3.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 UA3/actividad/team_0/Miembro3.java diff --git a/UA3/actividad/team_0/Miembro3.java b/UA3/actividad/team_0/Miembro3.java new file mode 100644 index 00000000..028087f5 --- /dev/null +++ b/UA3/actividad/team_0/Miembro3.java @@ -0,0 +1,12 @@ +import java.net.InetAddress; + +public class Miembro3 extends MiembroToken { + public Miembro3() throws Exception { + super(10002, 3, false, false, InetAddress.getByName("localhost"), 10000,3); + } + + public static void main(String[] args) throws Exception { + Miembro3 miembro3 = new Miembro3(); + miembro3.start(); + } +} From 740527f50284bdc0a02f52392d7d18503a504ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:57:04 +0100 Subject: [PATCH 27/37] Update MiembroToken.java --- UA3/actividad/team_0/MiembroToken.java | 104 +++++++++++++++++++++---- 1 file changed, 89 insertions(+), 15 deletions(-) diff --git a/UA3/actividad/team_0/MiembroToken.java b/UA3/actividad/team_0/MiembroToken.java index c65ba24e..a67e0805 100644 --- a/UA3/actividad/team_0/MiembroToken.java +++ b/UA3/actividad/team_0/MiembroToken.java @@ -3,9 +3,9 @@ * * @brief Solución para la actividad evaluable de la UA3. * @date 14/12/2022 - * @author Nombre Apellidos Miembro 1 - github@email (dev_A) - * @author Nombre Apellidos Miembro 2 - github@email (dev_B) - * @author Nombre Apellidos Miembro 3 - github@email (dev_C) + * @author Manuel Torres Alcázar Miembro 1 - manolotorraz@gmail.com (dev_30) + * @author Oscar Muñoz Molinero Miembro 2 - oscar.3598@gmail.com (dev_21) + * @author Adrián Cruz Barranco Miembro 3 - adriancb2023@gmail.com (dev_8) * @author Nombre Apellidos Miembro 4 - github@email (dev_D) * * @note ¡Pero qué diablos! @@ -21,17 +21,91 @@ * @todo FR4 [1 punto]: Mejora la clase MiembroToken para crear una red token ring de anillo doble, es decir, se puede tener otro token en otro anillo virtual, en sentido contrario. */ -public class MiembroToken -{ - /* @brief Classic java main, starting execution - * @param arg[0] = [id] - * @param arg[1] = [puerto] - * @param arg[2] = [token_al_inicio] - * @param arg[3] = [soy_el_ultimo] - */ - public static void main(String[] args) - { +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; - } // End of main() +public class MiembroToken extends Thread { + private DatagramSocket socket; + private int puertoEscucha; + private int tiempoEspera; + private boolean tieneToken; + private boolean esUltimoMiembro; + private InetAddress direccionSiguiente; + private int puertoSiguiente; + private int id; -} // End of class + public MiembroToken(int puertoEscucha, int tiempoEspera, boolean tieneToken, boolean esUltimoMiembro, InetAddress direccionSiguiente, int puertoSiguiente, int id) throws Exception { + this.puertoEscucha = puertoEscucha; + this.tiempoEspera = tiempoEspera; + this.tieneToken = tieneToken; + this.esUltimoMiembro = esUltimoMiembro; + this.direccionSiguiente = direccionSiguiente; + this.puertoSiguiente = puertoSiguiente; + this.socket = new DatagramSocket(puertoEscucha); + this.id = id; + } + + @Override + public void run() { + try { + // 10 ciclos de envío y recepción de token + for (int i = 0; i < 10; i++) { + if (tieneToken) { + System.out.println("Soy el miembro " + id); + manejarToken(); + estadoToken(); + } else { + miembroRecibido(); + recibirToken(); + estadoToken(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void miembroRecibido() { + if (puertoEscucha == 10000) { + System.out.println("Miembro 3 recibido"); + } else if (puertoEscucha == 10001) { + System.out.println("Miembro 1 recibido"); + } else if (puertoEscucha == 10002) { + System.out.println("Miembro 2 recibido"); + } + + } + + private void estadoToken() { + System.out.println("Tiene token: " + tieneToken); + } + + private void recibirToken() throws Exception { + byte[] buffer = new byte[256]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket.receive(packet); + tieneToken = true; + System.out.println("Token recibido en el puerto " + puertoEscucha); + } + + private void manejarToken() throws Exception { + long tiempoInicio = System.currentTimeMillis(); + System.out.println("Token manejado en el puerto " + puertoEscucha); + Thread.sleep(tiempoEspera * 1000); + long tiempoFin = System.currentTimeMillis(); + System.out.println("Tiempo con el token: " + (tiempoFin - tiempoInicio) + " ms"); + + if (!esUltimoMiembro) { + enviarToken(); + } + tieneToken = false; + } + + private void enviarToken() throws Exception { + byte[] buffer = "TOKEN".getBytes(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, direccionSiguiente, puertoSiguiente); + socket.send(packet); + System.out.println("Token enviado al puerto " + puertoSiguiente); + } +} From c40bc6946b0bce56cb848a84d12d17da43d6c3ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 5 Feb 2025 15:01:41 +0100 Subject: [PATCH 28/37] . --- UA3/actividad/{team_0 => team_8}/Miembro1.java | 0 UA3/actividad/{team_0 => team_8}/Miembro2.java | 0 UA3/actividad/{team_0 => team_8}/Miembro3.java | 0 UA3/actividad/{team_0 => team_8}/MiembroToken.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename UA3/actividad/{team_0 => team_8}/Miembro1.java (100%) rename UA3/actividad/{team_0 => team_8}/Miembro2.java (100%) rename UA3/actividad/{team_0 => team_8}/Miembro3.java (100%) rename UA3/actividad/{team_0 => team_8}/MiembroToken.java (100%) diff --git a/UA3/actividad/team_0/Miembro1.java b/UA3/actividad/team_8/Miembro1.java similarity index 100% rename from UA3/actividad/team_0/Miembro1.java rename to UA3/actividad/team_8/Miembro1.java diff --git a/UA3/actividad/team_0/Miembro2.java b/UA3/actividad/team_8/Miembro2.java similarity index 100% rename from UA3/actividad/team_0/Miembro2.java rename to UA3/actividad/team_8/Miembro2.java diff --git a/UA3/actividad/team_0/Miembro3.java b/UA3/actividad/team_8/Miembro3.java similarity index 100% rename from UA3/actividad/team_0/Miembro3.java rename to UA3/actividad/team_8/Miembro3.java diff --git a/UA3/actividad/team_0/MiembroToken.java b/UA3/actividad/team_8/MiembroToken.java similarity index 100% rename from UA3/actividad/team_0/MiembroToken.java rename to UA3/actividad/team_8/MiembroToken.java From 11adf40359d0b981788a4c5e7dc3464d7dd5af7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Tue, 11 Feb 2025 15:26:50 +0100 Subject: [PATCH 29/37] subida tareas --- UA3/tareas/dev_22/untitled/src/Cliente.java | 33 +++++++++++++++++ UA3/tareas/dev_22/untitled/src/Numeros.java | 39 ++++++++++++++++++++ UA3/tareas/dev_22/untitled/src/Servidor.java | 26 +++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 UA3/tareas/dev_22/untitled/src/Cliente.java create mode 100644 UA3/tareas/dev_22/untitled/src/Numeros.java create mode 100644 UA3/tareas/dev_22/untitled/src/Servidor.java diff --git a/UA3/tareas/dev_22/untitled/src/Cliente.java b/UA3/tareas/dev_22/untitled/src/Cliente.java new file mode 100644 index 00000000..d506c537 --- /dev/null +++ b/UA3/tareas/dev_22/untitled/src/Cliente.java @@ -0,0 +1,33 @@ +import java.io.*; +import java.net.*; +import java.util.Scanner; + +public class Cliente { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + System.out.print("Introduce un numero entero: "); + int numero1 = scanner.nextInt(); + + if (numero1 < 0) { + System.err.println("El numero debe ser mayor o igual a 0."); + return; + } + + Numeros numeros = new Numeros(); + numeros.setNumero1(numero1); + + try (Socket socket = new Socket("localhost", 12345); + ObjectOutputStream objetoenviado = new ObjectOutputStream(socket.getOutputStream()); + ObjectInputStream objetorecivido = new ObjectInputStream(socket.getInputStream())) { + + objetoenviado.writeObject(numeros); + Numeros resultado = (Numeros) objetorecivido.readObject(); + + System.out.println("El cuadrado es: " + resultado.getNumero2()); + System.out.println("El cubo es: " + resultado.getNumero3()); + + } catch (IOException | ClassNotFoundException e) { + System.err.println("Error con el servidor: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/UA3/tareas/dev_22/untitled/src/Numeros.java b/UA3/tareas/dev_22/untitled/src/Numeros.java new file mode 100644 index 00000000..ab8cb42e --- /dev/null +++ b/UA3/tareas/dev_22/untitled/src/Numeros.java @@ -0,0 +1,39 @@ +import java.io.Serializable; + +public class Numeros implements Serializable { + int numero1; + long numero2, numero3; + + public Numeros() { + } + + public Numeros(int numero1, long numero2, long numero3) { + this.numero1 = numero1; + this.numero2 = numero2; + this.numero3 = numero3; + } + + public int getNumero1() { + return numero1; + } + + public long getNumero2() { + return numero2; + } + + public long getNumero3() { + return numero3; + } + + public void setNumero1(int numero1) { + this.numero1 = numero1; + } + + public void setNumero2(long numero2) { + this.numero2 = numero2; + } + + public void setNumero3(long numero3) { + this.numero3 = numero3; + } +} \ No newline at end of file diff --git a/UA3/tareas/dev_22/untitled/src/Servidor.java b/UA3/tareas/dev_22/untitled/src/Servidor.java new file mode 100644 index 00000000..4d0d5b4b --- /dev/null +++ b/UA3/tareas/dev_22/untitled/src/Servidor.java @@ -0,0 +1,26 @@ +import java.io.*; +import java.net.*; + +public class Servidor { + public static void main(String[] args) { + try (ServerSocket serverSocket = new ServerSocket(12345)) { + System.out.println("Servidor: esperando conexiones..."); + + try (Socket clientSocket = serverSocket.accept(); + ObjectInputStream objetorecivido = new ObjectInputStream(clientSocket.getInputStream()); + ObjectOutputStream objetoenviado = new ObjectOutputStream(clientSocket.getOutputStream())) { + + Numeros numeros = (Numeros) objetorecivido.readObject(); + numeros.setNumero2((long) Math.pow(numeros.getNumero1(), 2)); + numeros.setNumero3((long) Math.pow(numeros.getNumero1(), 3)); + + objetoenviado.writeObject(numeros); + } catch (IOException | ClassNotFoundException e) { + System.err.println("Error en la comunicacion: " + e.getMessage()); + } + + } catch (IOException e) { + System.err.println("Error del servidor: " + e.getMessage()); + } + } +} \ No newline at end of file From 5eacd69ca9dbdf36b0b90354b614c9af304f4cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 12 Feb 2025 19:12:39 +0100 Subject: [PATCH 30/37] Examen 1 subida --- UA3/examen/dev_22/ejercicio1/src/Cliente.java | 77 +++++++++++++++++ UA3/examen/dev_22/ejercicio1/src/Readme.md | 16 ++++ .../dev_22/ejercicio1/src/Servidor.java | 82 +++++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 UA3/examen/dev_22/ejercicio1/src/Cliente.java create mode 100644 UA3/examen/dev_22/ejercicio1/src/Readme.md create mode 100644 UA3/examen/dev_22/ejercicio1/src/Servidor.java diff --git a/UA3/examen/dev_22/ejercicio1/src/Cliente.java b/UA3/examen/dev_22/ejercicio1/src/Cliente.java new file mode 100644 index 00000000..b426c219 --- /dev/null +++ b/UA3/examen/dev_22/ejercicio1/src/Cliente.java @@ -0,0 +1,77 @@ +import java.io.*; +import java.net.Socket; + +public class Cliente implements Runnable { + + private Socket socket; + private DataInputStream entrada; + private DataOutputStream salida; + private String nombreUsuario; + private boolean bucle = true; + + public Cliente(Socket s, String nombreUsuario) { + this.socket = s; + this.nombreUsuario = nombreUsuario; + + try { + entrada = new DataInputStream(socket.getInputStream()); + salida = new DataOutputStream(socket.getOutputStream()); + salida.writeUTF(nombreUsuario); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void run() { + while (bucle) { + try { + String mensaje = entrada.readUTF(); + System.out.println(mensaje); + } catch (IOException e) { + e.printStackTrace(); + } + } + + try { + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws IOException { + String Host = "localhost"; + int Puerto = 6000; // Puerto + Socket s = null; + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + boolean bucle = true; + + System.out.println("Escribe tu nombre de usuario: "); + String nombreUsuario = br.readLine(); + + if (nombreUsuario.trim().isEmpty()) { + System.out.println("El nombre de usuario no está disponible"); + return; + } + + try { + s = new Socket(Host, Puerto); + Cliente c = new Cliente(s, nombreUsuario); + Thread t = new Thread(c); + t.start(); + + while (bucle) { + String mensaje = br.readLine(); + if (mensaje.equalsIgnoreCase("Salir")) { + bucle = false; + c.salida.writeUTF("Salir"); + } else { + c.salida.writeUTF(mensaje); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/UA3/examen/dev_22/ejercicio1/src/Readme.md b/UA3/examen/dev_22/ejercicio1/src/Readme.md new file mode 100644 index 00000000..5c473ca6 --- /dev/null +++ b/UA3/examen/dev_22/ejercicio1/src/Readme.md @@ -0,0 +1,16 @@ +**¿Es más conveniente utilizar TCP o UDP en este caso? Explica tu respuesta.** + +Para este caso es recomendable usar TCP, ya que queremos hacer una conexión Cliente-Servidor +y TCP es más confiable que UDP, ya que TCP garantiza la entrega de los datos, mientras que UDP no. + + + +**¿Qué hace este programa?** + +El servidor recibe un mensaje del cliente y lo imprime en pantalla, para así tener un registro del chat, +este mismo mensaje, lo podrán recibir el resto de clientes conectados al servidor. + +**¿Problemas a solucionar?** + +Ahora mismo el programa, cuando el cliente intenta salirse del chat, con el mensaje "Salir", este peta, +pero el servidor lo registra correctamente. \ No newline at end of file diff --git a/UA3/examen/dev_22/ejercicio1/src/Servidor.java b/UA3/examen/dev_22/ejercicio1/src/Servidor.java new file mode 100644 index 00000000..babbf0fe --- /dev/null +++ b/UA3/examen/dev_22/ejercicio1/src/Servidor.java @@ -0,0 +1,82 @@ +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +public class Servidor { + + private static List clientes = new ArrayList<>(); + + public static void main(String[] args) throws IOException { + int Puerto = 6000; // Puerto + ServerSocket servidor = new ServerSocket(Puerto); + System.out.println("Escuchando en " + servidor.getLocalPort()); + + while (true) { + Socket cliente = servidor.accept(); + ClienteHandler clienteHandler = new ClienteHandler(cliente); + clientes.add(clienteHandler); + new Thread(clienteHandler).start(); + } + } + + public static void broadcastMessage(String mensaje, ClienteHandler sender) { + for (ClienteHandler cliente : clientes) { + if (cliente != sender) { + cliente.enviarMensaje(mensaje); + } + } + } + + static class ClienteHandler implements Runnable { + private Socket socket; + private DataInputStream entrada; + private DataOutputStream salida; + private String nombreUsuario; + + public ClienteHandler(Socket socket) { + this.socket = socket; + try { + entrada = new DataInputStream(socket.getInputStream()); + salida = new DataOutputStream(socket.getOutputStream()); + nombreUsuario = entrada.readUTF(); + System.out.println(nombreUsuario + " se ha conectado."); + broadcastMessage(nombreUsuario + " se ha unido al chat.", this); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void enviarMensaje(String mensaje) { + try { + salida.writeUTF(mensaje); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void run() { + while (true) { + try { + String mensaje = entrada.readUTF(); + if (mensaje.equalsIgnoreCase("Salir")) { + System.out.println(nombreUsuario + " se ha desconectado."); + broadcastMessage(nombreUsuario + " ha salido del chat.", this); + socket.close(); + break; + } else { + System.out.println(nombreUsuario + ": " + mensaje); + broadcastMessage(nombreUsuario + ": " + mensaje, this); + } + } catch (IOException e) { + e.printStackTrace(); + break; + } + } + } + } +} \ No newline at end of file From cf7e0ffe66e0d7c0011ef0125435f2295dbc634f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 12 Feb 2025 19:14:14 +0100 Subject: [PATCH 31/37] subida --- UA3/examen/dev_22/{ejercicio1 => UA3-EX-EJ1}/src/Cliente.java | 0 UA3/examen/dev_22/{ejercicio1 => UA3-EX-EJ1}/src/Readme.md | 0 UA3/examen/dev_22/{ejercicio1 => UA3-EX-EJ1}/src/Servidor.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename UA3/examen/dev_22/{ejercicio1 => UA3-EX-EJ1}/src/Cliente.java (100%) rename UA3/examen/dev_22/{ejercicio1 => UA3-EX-EJ1}/src/Readme.md (100%) rename UA3/examen/dev_22/{ejercicio1 => UA3-EX-EJ1}/src/Servidor.java (100%) diff --git a/UA3/examen/dev_22/ejercicio1/src/Cliente.java b/UA3/examen/dev_22/UA3-EX-EJ1/src/Cliente.java similarity index 100% rename from UA3/examen/dev_22/ejercicio1/src/Cliente.java rename to UA3/examen/dev_22/UA3-EX-EJ1/src/Cliente.java diff --git a/UA3/examen/dev_22/ejercicio1/src/Readme.md b/UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md similarity index 100% rename from UA3/examen/dev_22/ejercicio1/src/Readme.md rename to UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md diff --git a/UA3/examen/dev_22/ejercicio1/src/Servidor.java b/UA3/examen/dev_22/UA3-EX-EJ1/src/Servidor.java similarity index 100% rename from UA3/examen/dev_22/ejercicio1/src/Servidor.java rename to UA3/examen/dev_22/UA3-EX-EJ1/src/Servidor.java From b7199e21d67ab6951487945af87b90f1791124e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 12 Feb 2025 19:49:13 +0100 Subject: [PATCH 32/37] subida parte 2 --- UA3/examen/dev_22/UA3-EX-EJ2/src/Cliente.java | 41 ++++++++++++++++ UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md | 13 +++++ .../dev_22/UA3-EX-EJ2/src/Servidor.java | 47 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 UA3/examen/dev_22/UA3-EX-EJ2/src/Cliente.java create mode 100644 UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md create mode 100644 UA3/examen/dev_22/UA3-EX-EJ2/src/Servidor.java diff --git a/UA3/examen/dev_22/UA3-EX-EJ2/src/Cliente.java b/UA3/examen/dev_22/UA3-EX-EJ2/src/Cliente.java new file mode 100644 index 00000000..c97b9593 --- /dev/null +++ b/UA3/examen/dev_22/UA3-EX-EJ2/src/Cliente.java @@ -0,0 +1,41 @@ +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.Scanner; + +public class Cliente { + public static void main(String[] args) { + try { + DatagramSocket socket = new DatagramSocket(); + InetAddress address = InetAddress.getByName("localhost"); + Scanner sc = new Scanner(System.in); + String mensaje; + String respuesta; + + String registro = "Cliente conectado"; + byte[] buffer = registro.getBytes(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876); + socket.send(packet); + + do { + byte[] receiveBuffer = new byte[1024]; + DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); + socket.receive(receivePacket); + mensaje = new String(receivePacket.getData(), 0, receivePacket.getLength()); + System.out.println("Mensaje del SERVIDOR: " + mensaje); + + InetAddress serverAddress = receivePacket.getAddress(); + int serverPort = receivePacket.getPort(); + System.out.println("Escribe un mensaje para el SERVIDOR:"); + respuesta = sc.nextLine(); + buffer = respuesta.getBytes(); + packet = new DatagramPacket(buffer, buffer.length, serverAddress, serverPort); + socket.send(packet); + } while (!mensaje.equals("Adios") && !respuesta.equals("Adios")); + + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md b/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md new file mode 100644 index 00000000..8e0dd700 --- /dev/null +++ b/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md @@ -0,0 +1,13 @@ +**¿Es más conveniente utilizar TCP o UDP en este caso? Explica tu respuesta.** + +Para este caso es recomendable usar UDP, ay que no nos importa si las notificaciones, llegan en orden, o bien, que se nos pueda perder alguna por el camino. +Sino que nos interesa la eficiencia, y que sea rápido, por lo que UDP es la mejor opción. + +**¿Qué hace este programa?** + +El servidor manda un mensaje o alerta, según lo que queramos hacer, y este es enviado a todos los clientes que estén conectados al servidor. Para ello, hemos establecido un puerto en ambos +para que estén en constante comunicación. + +**¿Problemas a solucionar?** + +No sé si es un problema como tal, pero cuando el Cliente intenta salir de la aplicacion, no se cierra la comunicacion hasta que el Servidor, nos mande un mensaje, o bien, el corte la comunicacion antes. \ No newline at end of file diff --git a/UA3/examen/dev_22/UA3-EX-EJ2/src/Servidor.java b/UA3/examen/dev_22/UA3-EX-EJ2/src/Servidor.java new file mode 100644 index 00000000..25a84a91 --- /dev/null +++ b/UA3/examen/dev_22/UA3-EX-EJ2/src/Servidor.java @@ -0,0 +1,47 @@ +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Servidor { + public static void main(String[] args) { + try { + DatagramSocket socket = new DatagramSocket(9876); + List clientAddresses = new ArrayList<>(); + List clientPorts = new ArrayList<>(); + Scanner sc = new Scanner(System.in); + String mensaje; + String respuesta; + + do { + System.out.println("Escribe un mensaje para los Clientes:"); + mensaje = sc.nextLine(); + byte[] buffer = mensaje.getBytes(); + + for (int i = 0; i < clientAddresses.size(); i++) { + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, clientAddresses.get(i), clientPorts.get(i)); + socket.send(packet); + } + + byte[] receiveBuffer = new byte[1024]; + DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); + socket.receive(receivePacket); + respuesta = new String(receivePacket.getData(), 0, receivePacket.getLength()); + System.out.println("Respuesta del Cliente: " + respuesta); + + InetAddress clientAddress = receivePacket.getAddress(); + int clientPort = receivePacket.getPort(); + if (!clientAddresses.contains(clientAddress) || !clientPorts.contains(clientPort)) { + clientAddresses.add(clientAddress); + clientPorts.add(clientPort); + } + } while (!mensaje.equals("Adios") && !respuesta.equals("Adios")); + + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file From 3904c157a2499dcc856e99647fe46ba258b419a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:25:51 +0100 Subject: [PATCH 33/37] Create ua4tarea1.md --- UA4/tareas/dev_22/ua4tarea1.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 UA4/tareas/dev_22/ua4tarea1.md diff --git a/UA4/tareas/dev_22/ua4tarea1.md b/UA4/tareas/dev_22/ua4tarea1.md new file mode 100644 index 00000000..8dfccbea --- /dev/null +++ b/UA4/tareas/dev_22/ua4tarea1.md @@ -0,0 +1,12 @@ +¿Qué debemos tener para poder ejecutarlo? + +Debemos tener instalado Maven, e importar la librería Commons + +Para instalarlo, tendremos que: + +Crear un proyecto con Maven, importar la librería Commons en el proyecto, copiar las clases en el directorio del proyecto, y por último, +configurar el usuario de Windows en la aplicación. + +Luego ya, iniciamos el servidor y seleccionamos un directorio. + +Para ejecutar las operaciones adicionales, ejecutamos la clase ClienteFicheros. From 4548f95af22ab8d286e990adf3a84c7f3f198756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20David=20Vela=20Castro?= Date: Thu, 20 Feb 2025 19:56:40 +0100 Subject: [PATCH 34/37] Update Readme.md --- UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md b/UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md index 5c473ca6..34f8d259 100644 --- a/UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md +++ b/UA3/examen/dev_22/UA3-EX-EJ1/src/Readme.md @@ -1,3 +1,5 @@ +//Revisado por JD: 20/02/2025 + **¿Es más conveniente utilizar TCP o UDP en este caso? Explica tu respuesta.** Para este caso es recomendable usar TCP, ya que queremos hacer una conexión Cliente-Servidor @@ -13,4 +15,4 @@ este mismo mensaje, lo podrán recibir el resto de clientes conectados al servid **¿Problemas a solucionar?** Ahora mismo el programa, cuando el cliente intenta salirse del chat, con el mensaje "Salir", este peta, -pero el servidor lo registra correctamente. \ No newline at end of file +pero el servidor lo registra correctamente. From 86b788495d7290872380d72c8af3d6717719ea75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20David=20Vela=20Castro?= Date: Thu, 20 Feb 2025 19:57:14 +0100 Subject: [PATCH 35/37] Update Readme.md --- UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md b/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md index 8e0dd700..8d02bda0 100644 --- a/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md +++ b/UA3/examen/dev_22/UA3-EX-EJ2/src/Readme.md @@ -1,3 +1,5 @@ +//Revisado por JD: 20/02/2025 + **¿Es más conveniente utilizar TCP o UDP en este caso? Explica tu respuesta.** Para este caso es recomendable usar UDP, ay que no nos importa si las notificaciones, llegan en orden, o bien, que se nos pueda perder alguna por el camino. @@ -10,4 +12,4 @@ para que estén en constante comunicación. **¿Problemas a solucionar?** -No sé si es un problema como tal, pero cuando el Cliente intenta salir de la aplicacion, no se cierra la comunicacion hasta que el Servidor, nos mande un mensaje, o bien, el corte la comunicacion antes. \ No newline at end of file +No sé si es un problema como tal, pero cuando el Cliente intenta salir de la aplicacion, no se cierra la comunicacion hasta que el Servidor, nos mande un mensaje, o bien, el corte la comunicacion antes. From 72bf393928f5119af0b107fb73b04a9788c75d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= Date: Wed, 5 Mar 2025 17:43:30 +0100 Subject: [PATCH 36/37] apirest --- UA4/examen/dev_22/APIRest/pom.xml | 34 +++++++++++++ .../com/javafx/RestApiApplication.java | 48 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 UA4/examen/dev_22/APIRest/pom.xml create mode 100644 UA4/examen/dev_22/APIRest/src/main/java/franciscojosenavarro/com/javafx/RestApiApplication.java diff --git a/UA4/examen/dev_22/APIRest/pom.xml b/UA4/examen/dev_22/APIRest/pom.xml new file mode 100644 index 00000000..6ce6b731 --- /dev/null +++ b/UA4/examen/dev_22/APIRest/pom.xml @@ -0,0 +1,34 @@ + + 4.0.0 + + franciscojosenavarro.com.javafx + APIRest + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + 3.1.0 + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + + + src/main/java + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/UA4/examen/dev_22/APIRest/src/main/java/franciscojosenavarro/com/javafx/RestApiApplication.java b/UA4/examen/dev_22/APIRest/src/main/java/franciscojosenavarro/com/javafx/RestApiApplication.java new file mode 100644 index 00000000..b814232a --- /dev/null +++ b/UA4/examen/dev_22/APIRest/src/main/java/franciscojosenavarro/com/javafx/RestApiApplication.java @@ -0,0 +1,48 @@ +package franciscojosenavarro.com.javafx; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +@SpringBootApplication +@RestController +@RequestMapping("/api/persons") +public class RestApiApplication { + + private final Map persons = new HashMap<>(); + private final AtomicInteger counter = new AtomicInteger(1); + + public static void main(String[] args) { + SpringApplication.run(RestApiApplication.class, args); + } + + @GetMapping + public Map getPersons() { + return persons; + } + + @GetMapping("/{id}") + public String getPerson(@PathVariable int id) { + return persons.getOrDefault(id, "Person not found"); + } + + @PostMapping + public String addPerson(@RequestBody String name) { + int id = counter.getAndIncrement(); + persons.put(id, name); + return "Added person with ID: " + id; + } + + @DeleteMapping("/{id}") + public String deletePerson(@PathVariable int id) { + if (persons.remove(id) != null) { + return "Deleted person with ID: " + id; + } else { + return "Person not found"; + } + } +} \ No newline at end of file From fe8a8ad6f6f4ab8c8d69d61c87b0645b79765d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Navarro=20Ruiz?= <142453327+KatEston23@users.noreply.github.com> Date: Wed, 5 Mar 2025 17:47:26 +0100 Subject: [PATCH 37/37] Create readme.md --- UA4/examen/dev_22/APIRest/readme.md | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 UA4/examen/dev_22/APIRest/readme.md diff --git a/UA4/examen/dev_22/APIRest/readme.md b/UA4/examen/dev_22/APIRest/readme.md new file mode 100644 index 00000000..0048d219 --- /dev/null +++ b/UA4/examen/dev_22/APIRest/readme.md @@ -0,0 +1,31 @@ +![image](https://github.com/user-attachments/assets/e6a5770d-4ff6-4f56-910d-c720403f62d5) + + +Obtener personas. + +![image](https://github.com/user-attachments/assets/951eb5dc-e596-4f1d-9308-e009efe028d2) + +Agregar personas. + +![image](https://github.com/user-attachments/assets/4b5eacd0-fccc-4929-922b-901f7254e4a4) + +Crear Header +![image](https://github.com/user-attachments/assets/c6cd8417-e70d-4178-81d9-081a4c30c0d5) + +Añadir raw en body +![image](https://github.com/user-attachments/assets/3dedca99-c78a-408a-888c-6a7f0e1439fa) + + +Obtener personas por ID +![image](https://github.com/user-attachments/assets/1623da4e-025a-49b4-b9b8-ff6a0d4d4e5e) + + +Eliminar persona por ID + +![image](https://github.com/user-attachments/assets/c96f05b7-76b9-4230-8eae-b33f74ba3c93) + + + +Para poder usar Postman he tenido que descargar y ejecutar NGROK, para que me diera una direccion web, la cual no sea localhost y asi poder ejecutarla en la wewb de Postman + +![image](https://github.com/user-attachments/assets/36c3a721-94a7-418f-a152-c22dee1d2ac8)