1. UNIVERSIDAD REGIONAL AUTÓNOMA DE LOS ANDES
“UNIANDES”
ESCUELA DE SISTEMAS
CARRERA DE SISTEMAS
NOMBRE:ANGÉLICA PEÑA
CATEDRÁTICO:Ing. LUIS SUÁREZ
NIVEL: OCTAVO
MATERIA: DESARROLLO CLIENTE SERVIDOR II
TEMA: EJERCICIOS DE RMI
FECHA: 12-06-2015
IBARRA – ECUADOR
2. SERVIDOR DE ARCHIVOS
CLASSSERVER
ClassServer es una clase abstracta que proporciona funcionalidad básica de un mini-
servidor web, especializada. Para cargar archivos de clase única.
Un ClassServer debe extenderse y la subclase concreta debe definir el getBytes
Método que es responsable de recuperar los bytecodes para una clase.
La ClassServer crea un hilo que escucha en un socket y acepta HTTP GET peticiones. La
respuesta HTTP contiene el Bytecodes de la clase que se solicita en la cabecera GET.
Para cargar clases remotas, una aplicación RMI puede utilizar un hormigón Subclase de
este servidor en lugar de un servidor HTTP.
protected ClassServer(int port) throws IOException // Construye un ClassServer que
escucha en puerto
{
this.port = port;//puerto
server = new ServerSocket(port);
newListener();
}
Devuelve una matriz de bytes que contienen los códigos de bytes para
* La clase representada por el argumento ruta
* la ruta es un punto separa nombre de la clase con
* La extensión ".class" eliminado.
*return Los bytecodes de la clase
* ClassNotFoundExceptionexception si la clase correspondiente
* ruta no se pudo cargar.
* IOExceptionexception si se produce un error de lectura de la clase
public abstract byte[] getBytes(String path)
throws IOException, ClassNotFoundException;
El hilo "escuchar" que acepta una conexión con el
* Servidor, analiza la cabecera para obtener el nombre del archivo de clase
* Y devuelve los códigos de bytes para la clase (o error
* Si la clase no se encuentra o la respuesta fue mal formado).
public void run()
{
Socket socket;// aceptar una conexión
try {
socket = server.accept();
} catch (IOException e) {
System.out.println("Class Server died:" + e.getMessage());
3. return;
}
// Crear un nuevo hilo para aceptar la próxima conexión
newListener();
try {
DataOutputStreamout =
new DataOutputStream(socket.getOutputStream());
try {
// Obtener la ruta al archivo de clase de la cabecera
DataInputStreamin =
new DataInputStream(socket.getInputStream());
String path = getPath(in);
// Recuperar bytecodes
byte[] bytecodes = getBytes(path);
// Enviar códigos de bytes en respuesta (asume HTTP / 1.0 o posterior)
try {
out.writeBytes("C:/Users/LAB1-PC09/Documents/EJERCICIO
CS/ClassServer rn");
out.writeBytes("Content-Length:" + bytecodes.length +
"rn");
out.writeBytes("Content-Type:application/javarnrn");
out.write(bytecodes);
out.flush();
} catch (IOException ie) {
}
} catch (IOException | ClassNotFoundException e) {
// Escribir respuesta de error
out.writeBytes("C:/Users/LAB1-PC09/Documents/EJERCICIO CS/ClassServer " +
e.getMessage() + "rn");
out.writeBytes("Content-Type:text/htmlrnrn");
out.flush();
}
} catch (IOException ex) {
// Comer excepción (podría registrar errores para el archivo de registro, pero
// Escribir en stdout por ahora).
System.out.println("error writing response: " + ex.getMessage());
} finally {
try {
socket.close();
4. } catch (IOException e) {
}
}
}
* Crear un nuevo hilo para escuchar.
private void newListener()
{
(new Thread(this)).start();
}
Devuelve la ruta de acceso al archivo de clase obtenida a partir de
* Analizar la cabecera HTML.
private static String getPath(DataInputStreamin)
throws IOException
{
String line = in.readLine();
String path = "";
Clase extracto de línea GET
if (line.startsWith("GET /")) {
line = line.substring(5, line.length()-1).trim();
int index = line.indexOf(".class ");
if (index != -1) {
path = line.substring(0, index).replace('/', '.');
}
}
// Comer el resto de la cabecera
do {
line = in.readLine();
} while ((line.length() != 0) &&
(line.charAt(0) != 'r') && (line.charAt(0) != 'n'));
if (path.length() != 0) {
return path;
} else {
throw new IOException("Malformed Header");
}
}
}
CLASSFILESERVER.JAVA
El ClassFileServer implementa un ClassServer que
5. *Lee archivos de clases del sistema de archivos.
private String classpath;
private static int DefaultServerPort = 2001;
Construye un ClassFileServer.
CLASSPATH la ruta de clases donde el servidor localiza clases
public ClassFileServer(int port, String classpath) throws IOException
{
super(port);
this.classpath = classpath;
}
Devuelve una matriz de bytes que contienen los códigos de bytes para La clase
representada por el argumento ruta El ruta es un punto separa nombre de la clase con
La extensión ".class" eliminado. return Los bytecodes de la clase
ClassNotFoundExceptionexception si la clase correspondiente X ruta no se pudo cargar.
public byte[] getBytes(String path)
throws IOException, ClassNotFoundException
{
System.out.println("reading: " + path);
File f = new File(classpath + File.separator +
path.replace('.', File.separatorChar) + ".class");
int length = (int)(f.length());
if (length == 0) {
throw new IOException("File length is zero:" + path);
} else {
FileInputStreamfin = new FileInputStream(f);
DataInputStream in = new DataInputStream(fin);
byte[] bytecodes = new byte[length];
in.readFully(bytecodes);
return bytecodes;
}
}
Método principal para crear el servidor de clase que lee Los archivos de clase. Esto tiene
dos argumentos de la línea de comandos, los Puerto en el que el servidor acepta peticiones
y la Raíz de la ruta de clases. Para iniciar el servidor: java ClassFileServer <puerto> <ruta
de clase>
La base de código de un servidor RMI que utiliza este servidor web haría Simplemente
contener una URL con el host y el puerto de la web
Servidor (si classpath del servidor web es la misma que
6. Classpath del servidor RMI):
java -Djava.rmi.server.codebase = http: // zaphod: 2001 / RMIServer
Usted puede crear su propio servidor de clase dentro de su servidor RMI
La aplicación en lugar de ejecutar una por separado. En su servidor
Principal simplemente crear un ClassFileServer
nueva ClassFileServer (puerto, ruta de clase);
El ruta Es Un punto separa nombre de la clase con
La extensión ".class" Eliminado.
Los regresar bytecodes de la clase
ClassNotFoundExceptionexception si la clase Correspondiente
Ruta no se Pudo cargar.
No se pudo cargar.
public static void main(String args[])
{
int port = DefaultServerPort;
String classpath = "";
if (args.length >= 1) {
port = Integer.parseInt(args[0]);
}
if (args.length >= 2) {
classpath = args[1];
}
try {
ClassFileServer classFileServer = new ClassFileServer(port, classpath);
} catch (IOException e) {
System.out.println("Unable to start ClassServer:" +
e.getMessage());
}
}
}