2021-12-17 2P Pr1 Solucion
2021-12-17 2P Pr1 Solucion
2021-12-17 2P Pr1 Solucion
Por ejemplo, si se quiere copiar el fichero "PractEcho.java” al ordenador remoto, el cliente primero
se conecta al servidor, luego le envía el string del nombre del fichero "PractEcho.java" y finalmente el
contenido del fichero "PractEcho.java”. Por su parte, el servidor que soporta el servicio
“RemoteFileService”, tras la aceptación de la conexión, lee el nombre del fichero remoto, lo crea, si
no existe, y escribe en él el contenido que va leyendo hasta alcanzar el fin de fichero.
El estudiante tiene parte del código del cliente y servidor escritos, como se muestra a continuación.
Cliente
public class FileServiceClient {
…
myFileService.remoteCopy("PractEcho.java");
…
}
}
Servidor
// 3. Pendiente de implementar
// Crea un socket de servidor y espera una nueva conexión
// Por cada nueva conexión recibida, crea un objeto de FileService
// invoca el método remoteCopy de dicho objeto
// cierra recursos y vuelta a esperar conexión
}
}
SE PIDE:
1. Implemente los tres métodos marcados en el código anterior como pendientes de implementar
para que se realice la copia lo más rápido posible. Trate las excepciones donde corresponda.
Use únicamente las clases de entrada/salida que se proporcionan.
2. Se desea transformar el servidor anterior en un servidor multihilo. Reescriba el método main
del servidor que figura a continuación para que cree un thread por conexión. Complete la clase
FileService añadiendo solo lo que considere oportuno. Cree threads únicamente
implementando la interfaz Runnable. Otras opciones no puntúan.
}
Métodos más usuales para entrada/salida orientada a caracteres
InputStreamReader(InputStream in)
Creates a bridge from byte streams to character streams InputStreamReader.
OutputStreamWriter(OutputStream out)
Creates a bridge from character streams to byte streams OutputStreamWriter.
BufferedReader(Reader in)
Reads text from a character-input stream, buffering characters so as to provide
for the efficient reading of characters, arrays, and lines.
void write(String s)
Writes a String.
Java.io.PrintWriter
Sockets
Threads
Nota:
SE PIDE:
1. Cliente. Método remoteCopy
2. MonothreadFileServer. Clase FileService
3. Método main of MonothreadFileServer
4. Método main of MultithreadFileServer
5. Clase FileService MultithreadFileServer
Solución
try {
// Create a socket
clientSocket = new Socket(fileServiceHost, fileServicePort);
// Write the name of the remote file into the socket output stream
bufferedWriter.write(fileName);
bufferedWriter.newLine();
} catch (IOException e) {
System.out.println("Client: IOException: " + e.toString());
}
finally {
if (bufferedReader != null)
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bufferedWriter != null)
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
if ( clientSocket != null) {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2. Servidor Monohilo. Clase FileService
try {
// Get a buffered char inputStream from socket
inputStreamReader = new InputStreamReader(usrConnection.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
// Creates the destination file, reading the name from the socket
charOutputStream = new FileWriter(destinationFile);
bufferedWriter = new BufferedWriter(charOutputStream);
String line = null;
// while not eof of socket line input stream, read line and write
// it to the file using buffering
while ((line = bufferedReader.readLine()) != null) {
bufferedWriter.write(line);
bufferedWriter.newLine();
}
} catch (IOException e) {
System.out.println("Remote Server: " + e.getMessage());
}
finally {
if (usrConnection != null)
try {
usrConnection.close();
} catch (IOException e) {
System.out.println("Remote Server: Unable to close the socket"+ e.getMessage());
}
}
}
}
3. MonothreadFileServer. Método Main
4. Servidor Multihilo