Академический Документы
Профессиональный Документы
Культура Документы
ClassFileServer.java
/*
* Copyright (c) 1996, 1996, 1997 Sun Microsystems, Inc. All Rights Reserved.
*
* SUN НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ И НЕ ДЕЛАЕТ ЗАЯВЛЕНИЙ О ГОДНОСТИ ПРОГРАММНОГО
ОБЕСПЕЧЕНИЯ,
* НИ ВЫРАЖЕННЫХ, НИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫЕ
* ГАРАНТИИ ПРИГОДНОСТИ К ПРОДАЖЕ, СООТВЕТСТВИЯ СПЕЦИАЛЬНЫМ ТРЕБОВАНИЯМ ИЛИ
* НЕНАРУШЕНИЯ ПАТЕНТОВ. SUN НЕ БУДЕТ ОТВЕТСТВЕННА ЗА ЛЮБЫЕ ПРИЧИНЕННЫЕ ПОВРЕЖДЕНИЯ
* ИЗ-ЗА ИСПОЛЬЗОВАНИЯ, МОДИФИКАЦИИ ИЛИ РАСПРОСТРАНЕНИЯ ЭТОГО
* ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ПРОИЗВОДНЫХ.
*
*/
//package examples.classServer;
import java.io.*;
import java.net.*;
/**
* ClassFileServer реализует ClassServer, который
* читает файлы классов из файловой системы. Смотрите комментарий
* метода "Main" чтобы узнать, как запустить этот сервер.
*
*/
public class ClassFileServer
extends ClassServer
{
private String classpath;
/**
* Создает ClassFileServer.
*
* @param classpath - classpath, где сервер ищет классы
*/
public ClassFileServer(int port, String classpath) throws IOException
{
super(port);
this.classpath = classpath;
}
/**
* Возвращает массив байт, содержащий байт-коды для
* класса, представленного аргументом <b>path</b>.
* <b>path</b> является разделенным точкой именем класса с
* удаленным расширением ".class".
*
* @return - байт-коды для класса
* @exception ClassNotFoundException, если класс соответствующий
* <b>path</b> не может быть создан.
*/
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)
{
System.out.println( "Zero length file" );
throw new IOException("File length is zero: " + path);
}
else
{
FileInputStream fin = new FileInputStream(f);
DataInputStream in = new DataInputStream(fin);
/**
* Метод Main для создания сервера класса, который читает
* файлы классов. Он принимает два аргумента командной строки,
* номер порта, на котором сервер принимает запросы и
* корневой classpath. Для запуска сервера: <br><br>
*
* <code> java ClassFileServer <port> <classpath>
* </code><br><br>
*
* codebase RMI-сервера, использующая этот Web-сервер, будет
* просто содержать URL с хостом и портом Web-сервера
* (если classpath Web-сервера такой же как и classpath
* RMI-сервера): <br><br>
*
* <code> java -Djava.rmi.server.codebase=http://zaphod:2001/ RMIServer
* </code> <br><br>
*
* Вы можете создать свой собственный сервер классов внутри вашего серверного RMI-
* приложения вместо запуска его отдельно. В методе main вашего сервера просто
создается
* ClassFileServer: <br><br>
*
* <code> new ClassFileServer(port, classpath);
* </code>
*/
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
{
new ClassFileServer(port, classpath);
System.out.println("ClassFileServer started...");
}
catch (IOException e)
{
System.out.println("Unable to start ClassServer: " + e.getMessage());
e.printStackTrace();
}
}
}
ClassServer.java
// Copyright MageLang Institute; Version $Id:
//depot/main/src/edu/modules/RMI2/magercises/BootstrapHTTPServer/working/ClassServer.ja
va#2 $
/*
* Copyright (c) 1996, 1996, 1997 Sun Microsystems, Inc. All Rights Reserved.
*
* SUN НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ И НЕ ДЕЛАЕТ ЗАЯВЛЕНИЙ О ГОДНОСТИ ПРОГРАММНОГО
ОБЕСПЕЧЕНИЯ,
* НИ ВЫРАЖЕННЫХ, НИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫЕ
* ГАРАНТИИ ПРИГОДНОСТИ К ПРОДАЖЕ, СООТВЕТСТВИЯ СПЕЦИАЛЬНЫМ ТРЕБОВАНИЯМ ИЛИ
* НЕНАРУШЕНИЯ ПАТЕНТОВ. SUN НЕ БУДЕТ ОТВЕТСТВЕННА ЗА ЛЮБЫЕ ПРИЧИНЕННЫЕ ПОВРЕЖДЕНИЯ
* ИЗ-ЗА ИСПОЛЬЗОВАНИЯ, МОДИФИКАЦИИ ИЛИ РАСПРОСТРАНЕНИЯ ЭТОГО
* ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ПРОИЗВОДНЫХ.
*
* CopyrightVersion 1.1_beta
*/
//package examples.classServer;
import java.io.*;
import java.net.*;
/**
* ClassServer является абстрактным классом, обеспечивающим
* базовую функциональность мини Web-сервера, предназначенного
* только для загрузки файлов классов. ClassServer должен быть расширен
* и конкретный подкласс должен определить метод <b>getBytes</b>, который
* отвечает за извлечение байт-кодов класса.<p>
*
* ClassServer создает поток, который прослушивает сокет и
* принимает HTTP GET запросы.HTTP-ответ содержит байт-коды для класса,
* запрошенного в GET-заголовке. <p>
*
* Для загрузки удаленных классов RMI-приложение может использовать
* конкретный подкласс этого сервера вместо http-сервера.
*
*
* @see ClassFileServer
*/
public abstract class ClassServer
implements Runnable
{
/**
* Конструирует ClassServer, который прослушивает <b>port</b> и
* получает байт-коды класса, используя метод <b>getBytes</b>.
*
* @param port номер порта
* @exception IOException, если ClassServer не может прослушивать
* <b>port</b>.
*/
protected ClassServer(int port) throws IOException
{
this.port = port;
server = new ServerSocket(port);
newListener();
}
/**
*
* Возвращает массив байт, содержащий байт-коды для
* класса, представленного аргументом <b>path</b>.
* <b>path</b> является разделенным точкой именем класса с
* удаленным расширением ".class".
*
* @return - байт-коды для класса
* @exception ClassNotFoundException, если класс соответствующий
* <b>path</b> не может быть создан.
* @exception IOException если возникает ошибка чтения класса
*/
public abstract byte[] getBytes(String path) throws IOException,
ClassNotFoundException;
/**
* "Прослушивающий" поток, который принимает соединение к
* серверу, разбирает заголовок для получения имени файла класса
* и посылает назад байт-коды класса (или ошибку, если
* класс не найден, или ответ был нераспознан).
*/
public void run()
{
Socket socket;
// принять соединение
try
{
socket = server.accept();
}
catch (IOException e)
{
System.out.println("Class Server died: " + e.getMessage());
e.printStackTrace();
return;
}
try
{
DataOutputStream out =
new DataOutputStream(socket.getOutputStream());
try
{
// получить путь к файлам классов из заголовка
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String path = getPath(in);
// извлечь байт-коды
byte[] bytecodes = getBytes(path);
// послать байт-коды в качестве ответа (предполагает наличие HTTP/1.0
или более поздних)
try
{
out.writeBytes("HTTP/1.0 200 OK\r\n");
out.writeBytes("Content-Length: " + bytecodes.length + "\r\n");
out.writeBytes("Content-Type: application/java\r\n\r\n");
out.write(bytecodes);
out.flush();
}
catch (IOException ie)
{
return;
}
}
catch (Exception e)
{
// отобразить ошибку ответа
out.writeBytes("HTTP/1.0 400 " + e.getMessage() + "\r\n");
out.writeBytes("Content-Type: text/html\r\n\r\n");
out.flush();
}
}
catch (IOException ex)
{
// перехватить исключительную ситуацию
// (может регистрироваться на сервере в log-файл,
// но в данный момент только выводит информацию на stdout).
System.out.println("error writing response: " + ex.getMessage());
ex.printStackTrace();
}
finally
{
try
{
socket.close();
}
catch (IOException e)
{
}
}
}
/**
* Создание нового потока для прослушивания.
*/
private void newListener()
{
(new Thread(this)).start();
}
/**
* Возвращает путь к файлу классов, полученного из анализатора
* HTML заголовка.
*/
private static String getPath(BufferedReader in) throws IOException
{
String line = in.readLine();
String path = "";
if (path.length() != 0)
{
return path;
}
else
{
throw new IOException("Malformed Header");
}
}
}
HelloImpl.java
// Copyright MageLang Institute; Version $Id:
//depot/rkahle/src/edu/modules/RMI/magercises/BootstrapServer/HelloImpl.java#4 $
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public
class HelloImpl
extends UnicastRemoteObject
implements Hello
{
public HelloImpl() throws RemoteException
{
super();
}
MessageObject.java
// Copyright MageLang Institute; Version $Id:
//depot/rkahle/src/edu/modules/RMI/magercises/BootstrapServer/MessageObject.java#4 $
import java.io.Serializable;
public
class MessageObject
implements Serializable
{
static int number = 0;
private int objNumber;
public MessageObject()
{
objNumber = number;
System.out.println( "MessageObject: Class Number is #" + number + " Object Number
is #" + objNumber );
number = number + 1;
}
RMIClient.java
// Copyright MageLang Institute; Version $Id:
//depot/rkahle/src/edu/modules/RMI/magercises/BootstrapServer/RMIClient.java#4 $
import java.net.*;
import java.io.*;
import java.util.Properties;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIClient - это начальный загрузчик RMI-клиента.
*
* Он реализует интерфейс Runnable, так что
* имеет хорошо известный способ запуска.
*
*/
implements Runnable
{
// Экземпляр объекта Root
private Hello hello;
} // класс RMIClient
RMIClientBootstrapSecurityManager.java
// Copyright MageLang Institute; Version $Id:
//depot/main/src/edu/modules/RMI2/magercises/BootstrapClient/working/RMIClientBootstrap
SecurityManager.java#3 $
import java.rmi.RMISecurityManager;
/**
* Этот класс определяет политику безопасности для RMI-приложений,
* которые загружаются с сервера. Снижение безопасности,
* обеспечиваемое этим классом, является минимальным,
* требуемым для начальной загрузки и запуска
* клиентского RMI-приложения
*
* Изменения в политике по сравнению с RMISecurityManager:
*
* Проверка безопасности Данная политика RMISecurityManager
* ------------------------------ ------------ ------------------
* Доступ к группе Thread YES NO
* Доступ к Threads YES NO
* Создание загрузчика классов. YES NO
* Доступ к системным свойствам. YES NO
* Соединения YES NO
*
*/
/**
* Загруженные классы разрешаются для создания загрузчика классов.
*/
public synchronized void checkCreateClassLoader() {
// Provide null override
}
/**
* Разрешены соединения с другими машинами
*/
public synchronized void checkConnect(String host, int port) {
// Provide null override
}
/**
* Загруженным классам разрешено манипулировать потоком.
*/
public synchronized void checkAccess(Thread t) {
// Provide null override
}
/**
* Загруженным классам разрешено манипулировать группами потоков.
*/
public synchronized void checkAccess(ThreadGroup g) {
// Provide null override
}
/**
* Загруженным классам разрешено получить доступ к списку системных свойств.
*/
public synchronized void checkPropertiesAccess() {
// Обеспечьте переопределение null
}
}
RMIClientLoader.java
// Copyright MageLang Institute; Version $Id:
//depot/main/src/edu/modules/RMI2/magercises/BootstrapClient/working/RMIClientLoader.ja
va#3 $
import java.net.*;
import java.io.*;
import java.util.Properties;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIClientLoader используется для "начальной загрузки" системы RMI-клиента.
* Класс клиента и все его поддерживающие классы загружаются
* по ссылке RMI (через http-сервер)
*
*/
// Переменные команд
private String clientName;
p = System.getProperties();
System.out.println("" + url);
clientName = "RMIClient";
RMIServer.java
// Copyright MageLang Institute; Version $Id:
//depot/main/src/edu/modules/RMI2/magercises/BootstrapServer/working/RMIServer.java#3 $
import java.net.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIServer работает как сервер для удаленной службы "Hello".
*
* RMIServer начинает выполнение со стандартной точки входа "public static void main";
* Он создает экземпляр самого себя и продолжает работу в конструкторе.
*
*/
//
// -> Измените имя на имя вашего компьютера!
//
private static final String HOST_NAME = "localhost";
try
{
rmi = new RMIServer();
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println
(
"The host computer name you have specified, " +
HOST_NAME +
" does not match your real computer name."
);
}
catch ( RemoteException re )
{
System.out.println( "Error starting service" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "Internal error" + mURLe );
}
catch ( NotBoundException nbe )
{
System.out.println( "Not Bound" );
System.out.println( "" + nbe );
}
} // main
// Конструктор
public RMIServer()
throws RemoteException,
MalformedURLException,
NotBoundException
{
LocateRegistry.createRegistry( PORT );
System.out.println
(
"Registry created on host computer " +
HOST_NAME +
" on port " +
Integer.toString( PORT)
);
} // класс RMIServer
/*
Это новый класс для упражнения (1999/07/26), который попытается переделать
это все для работы с JDK 1.2
*/
/**
* Этот класс определяет политику безопасности для RMI-приложений,
* которые загружаются с сервера. Снижение безопасности,
* обеспечиваемое этим классом, является минимально
* необходимым для начальной загрузки и запуска
* клиентского RMI-приложения
*
* Изменения в политике по сравнению с RMISecurityManager:
*
* Проверка безопасности Данная политика RMISecurityManager
* ------------------------------ ------------ ------------------
* Доступ к группе Thread YES NO
* Доступ к Threads YES NO
* Создание загрузчика классов. YES NO
* Доступ к системным свойствам. YES NO
* Соединения YES NO
*
*/
class RMIServerSecurityManager
extends RMISecurityManager
{
/**
* Загруженным классам разрешается создание загрузчиков классов
*/
public synchronized void checkCreateClassLoader()
{
// Обеспечьте null-переопределение
System.out.println( "checkCreateClassLoader()");
}
/**
* Разрешены соединения с другой машиной.
*/
public synchronized void checkConnect( String host, int port )
{
// Обеспечьте null-переопределение
System.out.println( "checkConnect()");
}
/**
* Загруженным классам разрешается манипулировать потоками.
*/
public synchronized void checkAccess(Thread t)
{
// Обеспечьте null-переопределение
System.out.println( "checkAccess()");
}
/**
* Загруженным классам разрешается манипулировать группами потоков.
*/
public synchronized void checkAccess(ThreadGroup g)
{
// Обеспечьте null-переопределение
System.out.println( "checkAccess()");
}
/**
* Загруженным классам разрешается получать доступ к списку системных свойств..
*/
public synchronized void checkPropertiesAccess()
{
// Обеспечьте null-переопределение
System.out.println( "checkPropertiesAccess()");
}
runclient.bat
java -Djava.rmi.server.codebase=http://pickle:2002/ RMIClientLoader
runhttp.bat
rem Этот файл запустит простой HTTP-сервер, каторый функционирует только
rem как источник для файлов классов Java.
rem
rem Первый параметр - номер порта TCP/IP, который
rem этот сервер прослушивает.
rem
rem Второй параметр - локальный каталог, содержащий
rem файлы классов Java для обслуживания.
runserver.bat
java RMIServer
DistributedGarbageCollector
Hello.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/DistributedGarbageCollector/Solution/Hello.java#2 $
import java.rmi.*;
HelloImpl.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/DistributedGarbageCollector/Solution/HelloImpl.java#2 $
import java.rmi.*;
import java.rmi.server.*;
public
class HelloImpl
extends UnicastRemoteObject
return mo;
}
MessageObject.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/DistributedGarbageCollector/Solution/MessageObject.java#2 $
import java.io.Serializable;
import java.rmi.server.*;
public
MessageObjectImpl.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/DistributedGarbageCollector/Solution/MessageObjectImpl.java#2 $
import java.io.Serializable;
import java.rmi.server.*;
import java.rmi.*;
public
class MessageObjectImpl
extends UnicastRemoteObject
RMIClient.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/DistributedGarbageCollector/Solution/RMIClient.java#2 $
import java.util.Date;
import java.net.MalformedURLException;
import java.rmi.*;
/**
* RMIClient будет запрашивать удаленную службу "HelloService".
*
* Будет сделано много запросов, заставляя работать и
* распределенный сборщик мусора и локальный.
*
*/
//
// -> Измените это имя на имя вашего компьютера
//
private static final String HOST_NAME = "ROSA";
// Конструктор
public RMIClient()
{
try
{
Hello hello = (Hello)Naming.lookup( "//" + HOST_NAME + ":" + Integer.toString(
PORT ) + "/" + "Hello" );
MessageObject mo;
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println( "The host computer name you have specified, " + HOST_NAME
+ " does not match your real computer name." );
}
catch ( RemoteException re )
{
System.out.println( "A Remote Exception was thrown when requesting the
TimeService" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "There is a problem with the rmi: URL you are using" );
System.out.println( "" + mURLe );
}
catch ( NotBoundException nbe )
{
System.out.println( "" + nbe );
}
}
} // класс RMIClient
RMIServer.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/DistributedGarbageCollector/Solution/RMIServer.java#2 $
import java.net.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIServer работает как сервер для удаленной службы "HelloService".
*
* RMIServer начинает выполнение со стандартной точки входа "public static void main";
* Он создает экземпляр самого себя и продолжает работу в конструкторе.
*
*/
//
// -> Измените имя на имя вашего компьютера!
//
private static final String HOST_NAME = "ROSA";
try
{
rmi = new RMIServer();
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println( "The host computer name you have specified, " + HOST_NAME
+ " does not match your real computer name." );
}
catch ( RemoteException re )
{
System.out.println( "Error starting service" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "Internal error" + mURLe );
}
catch ( NotBoundException nbe )
{
System.out.println( "Not Bound" );
System.out.println( "" + nbe );
}
} // main
// Конструктор
public RMIServer() throws RemoteException, MalformedURLException, NotBoundException
{
LocateRegistry.createRegistry( PORT );
} // класс RMIServer
LocalRemoteClient
LocalRemoteClient.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteClient/Solution/LocalRemoteClient.java#2 $
/**
* Класс: LocalRemoteClient
*
* Цель: Протестировать использование модели делегирования для
* реализации удаленных и локальных версий
* сетевых служб RMI.
*/
import java.net.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
} // main
// Конструктор
public LocalRemoteClient()
{
RemoteModelMgr rmm;
LocalModel lm;
RemoteModelRef rmr;
String versionLocal;
String versionRemote;
try
{
rmm = (RemoteModelMgr)Naming.lookup( "rmi://" + HOST_NAME + ":" +
Integer.toString( PORT ) + "/RemoteModelManager" );
rmr = rmm.getRemoteModelRef();
versionRemote = rmr.getVersionNumber();
lm = rmm.getLocalModel();
versionLocal = lm.getVersionNumber();
} // класс LocalRemoteClient
runclient.bat
java -Djava.rmi.server.codebase=http://ROSA:2002/ RMIClientLoader
LocalRemoteServer
COMPILE.BAT
del *.class
javac *.java
rmic RemoteModelMgrImpl
rmic RemoteModelImpl
LocalModel.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteServer/Solution/LocalModel.java#2 $
/**
* Класс: LocalModel
*
* Цель: Обеспечить фактические службы для модели.
* Этот класс может быть сериализован и передан в
* другую JVM или он может быть делегирован
* из удаленного интерфейсного класса.
*/
return version;
}
}
LocalRemoteServer.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteServer/Solution/LocalRemoteServer.java#2 $
/**
* Класс: LocalRemoteServer
*
* Цель: Создать экземпляры и зарегистрировать удаленные службы,
* необходимые для этого упражнения.
*/
import java.net.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
//
// -> Измените это имя на имя вашего компьютера
//
private static final String HOST_NAME = "ROSA";
try
{
lrs = new LocalRemoteServer();
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println( "The host computer name you have specified, " + HOST_NAME
+ " does not match your real computer name." );
}
catch ( RemoteException re )
{
System.out.println( "Error starting service" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "Internal error" + mURLe );
}
catch ( NotBoundException nbe )
{
System.out.println( "Not Bound" );
System.out.println( "" + nbe );
}
} // main
// Конструктор
public LocalRemoteServer()
throws RemoteException,
MalformedURLException,
NotBoundException
{
LocateRegistry.createRegistry( PORT );
} // класс LocalRemoteServer
RemoteModelImpl.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteServer/Solution/RemoteModelImpl.java#2 $
/**
* Класс: RemoteModelImpl
*
* Цель: Обеспечить удаленный интерфейс для делегирования LocalModel
*
*/
public class RemoteModelImpl
extends java.rmi.server.UnicastRemoteObject
implements RemoteModelRef
{
LocalModel lm;
this.lm = lm;
System.out.println( "RemoteModelImpl...Constructor finished" );
return s;
}
RemoteModelMgr.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteServer/Solution/RemoteModelMgr.java#2 $
import java.rmi.*;
/**
* Интерфейс: RemoteModelMgr
*
* Цель: Обеспечить удаленный доступ к удаленной
* или возвращенной локальной копии "ComputationalModel"
*
* Примечания: RemoteModel является RMI "удаленным" интерфейсом.
* LocalModel является локальным интерфейсом
*/
interface RemoteModelMgr
extends java.rmi.Remote
{
RemoteModelRef getRemoteModelRef()
throws java.rmi.RemoteException;
LocalModel getLocalModel()
throws java.rmi.RemoteException;
}
RemoteModelMgrImpl.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteServer/Solution/RemoteModelMgrImpl.java#2 $
/**
* Класс: RemoteModelMgrImpl
*
* Цель: Обеспечить реализацию RMI-службы для RemoteModelMgr.
*
*
* Примечания: RemoteModel является RMI "удаленным" интерфейсом.
* LocalModel является локальным интерфейсом
*/
public class RemoteModelMgrImpl
extends java.rmi.server.UnicastRemoteObject
implements RemoteModelMgr
{
LocalModel lm;
RemoteModelImpl rmImpl;
/**
* Конструктор
*/
public RemoteModelMgrImpl()
throws java.rmi.RemoteException
{
super();
}
/**
* Возвращает ссылку на объект, выполняющий
* фактические операции. Если это RMI-вызов, будет возвращаться
* копия.
*/
public LocalModel getLocalModel()
throws java.rmi.RemoteException
{
// Отложенная инсталляция делегата
if ( null == lm )
{
lm = new LocalModel();
}
return lm;
}
}
RemoteModelRef.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/LocalRemoteServer/Solution/RemoteModelRef.java#2 $
/**
* Интерфейс: RemoteModelRef
*
* Цель: Обеспечить удаленный доступ к "ComputationalModel"
*
* Примечания:
*/
interface RemoteModelRef
extends java.rmi.Remote
{
String getVersionNumber() throws java.rmi.RemoteException;
}
RMICallback
Applet1.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMICallback/Solution/Applet1.java#2 $
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.Date;
import java.net.URL;
import java.rmi.*;
import java.rmi.server.*;
public
class Applet1
extends Applet
implements TimeMonitor
{
// Измените имя на имя вашего компьютера
private final static String HOST_NAME = "ROSA";
uiInit();
try
{
System.out.println( "Exporting the Applet" );
UnicastRemoteObject.exportObject( this );
URL base = getDocumentBase();
if ( 0 == hostName.length() )
{
hostName = HOST_NAME;
}
try
{
ts = (TimeServer)Naming.lookup( serverName );
}
catch ( Exception e )
{
System.out.println( "" + e );
}
ts.registerTimeMonitor( this );
}
catch ( RemoteException re )
{
System.out.println( "" + re );
}
}
button1.addActionListener
(
new ActionListener()
{
java.awt.TextArea textArea1;
java.awt.Button button1;
}
RMIServer.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMICallback/Solution/RMIServer.java#2 $
import java.net.*;
import java.io.*;
import java.util.Date;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIServer работает как сервер для удаленной службы "TimeServer" .
*
* RMIServer начинает выполнение со стандартной точки входа "public static void main";
* Он создает экземпляр самого себя и продолжает работу в конструкторе.
*
*/
//
// -> Измените имя на имя вашего компьютера!
//
private static final String HOST_NAME = "ROSA";
// Экземпляр самого себя
private static RMIServer rmi;
try
{
rmi = new RMIServer();
LocateRegistry.createRegistry( PORT );
UnicastRemoteObject.exportObject( ((TimeServer)rmi) );
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println( "The host computer name you have specified, " + HOST_NAME
+ " does not match your real computer name." );
}
catch ( RemoteException re )
{
System.out.println( "Error starting service" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "Internal error" + mURLe );
}
} // main
TimeTicker tt;
} // класс RMIServer
TimeTicker( TimeMonitor tm )
{
this.tm = tm;
}
TimeMonitor.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMICallback/Solution/TimeMonitor.java#2 $
import java.rmi.*;
import java.util.Date;
TimeServer.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMICallback/Solution/TimeServer.java#2 $
import java.rmi.*;
}
RMIParameters
Hello.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMIParameters/Solution/Hello.java#2 $
import java.rmi.*;
HelloImpl.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMIParameters/Solution/HelloImpl.java#2 $
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public
class HelloImpl
extends UnicastRemoteObject
implements Hello
{
MessageObject.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMIParameters/Solution/MessageObject.java#2 $
import java.io.Serializable;
public
class MessageObject
implements Serializable
{
static int number = 0;
private int objNumber;
public MessageObject()
{
objNumber = number;
number = number + 1;
}
RMIClient.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMIParameters/Solution/RMIClient.java#2 $
import java.net.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIClient02 утилизирует удаленный объект "Hello".
*
* RMIClient02 обращается к RMIServer для обработки командной строки.
*/
} // main
// Конструктор
public RMIClient()
{
Hello h;
String helloString;
MessageObject mo;
try
{
h = (Hello)Naming.lookup( "rmi://" + HOST_NAME + ":" + Integer.toString( PORT
) + "/HelloService" );
helloString = h.sayHello();
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println( "The host computer name you have specified, " + HOST_NAME
+ " does not match your real computer name." );
}
catch ( RemoteException re )
{
System.out.println( "A Remote Exception was thrown when requesting the
HelloService" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "There is a problem with the rmi: URL you are using" );
System.out.println( "" + mURLe );
}
catch ( NotBoundException nbe )
{
System.out.println( "" + nbe );
}
} // класс RMIClient
RMIServer.java
// Copyright MageLang Institute; Version $Id: //depot/main/src/edu/modules/RMI-
mml2/magercises/RMIParameters/Solution/RMIServer.java#2 $
import java.net.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
/**
* RMIServer работает как сервер для удаленной службы "HelloService" .
*
* RMIServer начинает выполнение со стандартной точки входа "public static void main";
* Он создает экземпляр самого себя и продолжает работу в конструкторе.
*
*/
//
// -> Измените имя на имя вашего компьютера!
//
private static final String HOST_NAME = "ROSA";
try
{
rmi = new RMIServer();
}
catch ( java.rmi.UnknownHostException uhe )
{
System.out.println( "The host computer name you have specified, " + HOST_NAME
+ " does not match your real computer name." );
}
catch ( RemoteException re )
{
System.out.println( "Error starting service" );
System.out.println( "" + re );
}
catch ( MalformedURLException mURLe )
{
System.out.println( "Internal error" + mURLe );
}
catch ( NotBoundException nbe )
{
System.out.println( "Not Bound" );
System.out.println( "" + nbe );
}
} // main
// Конструктор
public RMIServer() throws RemoteException, MalformedURLException, NotBoundException
{
LocateRegistry.createRegistry( PORT );
} // класс RMIServer
SimpleBankingSystem
Account.java
import java.rmi.Remote;
import java.rmi.RemoteException;
AccountImpl.java
import java.rmi.RemoteException;
// общедоступный конструктор
public AccountImpl (
BankManager bankManager,
Client client,
String accountNumber) {
this.bankManager = bankManager;
this.client = client;
this.balance = 0;
this.accountNumber = accountNumber;
}
BankManager.java
import java.rmi.Remote;
import java.rmi.RemoteException;
BankManagerImpl.java
import java.util.Hashtable;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
// Создайте счета:
// * поместите их в хэш-таблицу
// * назначьте их клиентам
Account account;
account = new AccountImpl(this, clientCharlie, "4434");
((AccountImpl)account).deposit(500);
UnicastRemoteObject.exportObject(account);
accounts.put("4434", account);
account = new AccountImpl(this, clientCharlie, "4461");
((AccountImpl)account).deposit(600);
UnicastRemoteObject.exportObject(account);
accounts.put("4461", account);
account = new AccountImpl(this, clientShannon, "6678");
((AccountImpl)account).deposit(700);
UnicastRemoteObject.exportObject(account);
accounts.put("6678", account);
}
}
BankSystemServer.java
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.net.MalformedURLException;
BankManager bm = null;
try {
// Создайте объект BankManager
bm = new BankManagerImpl();
System.out.println("Server started.");
System.out.println("Enter <CR> to end.");
try {
int i = System.in.read();
} catch (IOException ioException) {
}
System.exit(0);
}
}
BankUser.java
import java.rmi.*;
import java.net.MalformedURLException;
import java.util.Locale;
import java.text.NumberFormat;
try {
bm = (BankManager)Naming.lookup(
"rmi://localhost:1099/BankSystem");
} catch (MalformedURLException malformedException) {
System.err.println("Bad URL: " + malformedException);
} catch (NotBoundException notBoundException) {
System.err.println("Not Bound: " + notBoundException);
} catch (RemoteException remoteException) {
System.err.println("Remote Exception: " + remoteException);
}
try {
// Найдите счет 4461
Account account = bm.getAccount("4461");
Client.java
import java.rmi.Remote;
import java.rmi.RemoteException;
ClientImpl.java
import java.rmi.RemoteException;
// общедоступный конструктор
public ClientImpl(BankManager bm, String name) {
this.bankManager = bm;
this.clientName = name;
}
NoCashAvailableException.java
public class NoCashAvailableException extends Exception {
}
UMLDefinition
Account.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Account extends Remote
{
// Добавьте метод для возврата BankManager
public BankManager getBankManager()
throws RemoteException;
BankManager.java
import java.rmi.Remote;
import java.rmi.RemoteException;
Client.java
import java.rmi.Remote;
import java.rmi.RemoteException;