#java #rmi
#java #rmi
Вопрос:
Я пытаюсь запустить это приложение, используя клиент-сервер RMI. Во-первых, я запустил его и получил сообщение об ошибке «Отказано в подключении к хосту: localhost». После этого я пошел в system32 / drivers / etc / hosts и исправил это, добавил строку:
127.0.0.1 localhost
Это не привело меня к решению проблемы. Затем я просмотрел те же вопросы в stackoverflow о том, как исправить эту проблему, а затем решил ее с помощью (запускался в cmd):
start rmiregistry
Итак, rmiregistry запустился, и я получил новую ошибку — NotBoundException (но я мог бы исправить проблему «Отказа в подключении»).
servicebrowser.java:
package servicebrowser;
import java.awt.*;
import javax.swing.*;
import java.rmi.*;
import java.awt.event.*;
public class ServiceBrowser {
JPanel mainPanel;
JComboBox serviceList;
ServiceServer server;
public void buildGUI() {
Object[] services = getServicesList();
}
Object[] getServicesList() {
Object obj = null;
Object[] services = null;
try {
obj = Naming.lookup("rmi://127.0.0.1/ServiceServer");
}
catch (Exception ex) { ex.printStackTrace(); }
server = (ServiceServer) obj;
try {
services = server.getServiceList();
}
catch (Exception ex) { ex.printStackTrace(); }
return services;
}
class MyListListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
Object selection = serviceList.getSelectedItem();
loadService(selection);
}
}
public static void main(String[] args) {
new ServiceBrowser().buildGUI();
}
}
класс ServiceServerImpl:
import java.rmi.*;
import java.util.*;
import java.rmi.server.*;
public class ServiceServerImpl extends UnicastRemoteObject
implements ServiceServer {
HashMap serviceList;
public ServiceServerImpl() throws RemoteException {
setUpServices();
}
private void setUpServices() {
serviceList = new HashMap();
}
public Object[] getServiceList() {
System.out.println("in remote");
return serviceList.keySet().toArray();
}
public Service getService(Object serviceKey) throws RemoteException {
Service theService = (Service) serviceList.get(serviceKey);
return theService;
}
public static void main (String[] args) {
try {
Naming.rebind("ServiceServer", new ServiceServerImpl());
}
catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("Remote service is running");
}
}
Что с этим не так? Я, конечно, тоже отключил брандмауэр.
Комментарии:
1. У вас есть трассировка стека, которую вы можете нам показать? Какая строка выдает эту ошибку? Ваше смешивание в обсуждении других ошибок, которые вы (все еще?) получение сбивает с толку.
2. О, нет. Я исправил последние ошибки. Теперь у меня есть только одно: «NotBoundException».
3. Если только ваш сервер, клиент и сервис-браузер не запущены на одном компьютере,
Naming.lookup("rmi://127.0.0.1/ServiceServer")
выполняется поиск на неправильном хосте. Вам необходимо указать имя хоста или IP-адрес хоста сервера. Что также означает, что вам не нужно запускатьrmiregistry
на хосте клиента.4. Если я не запускаю rmiregistry на своем локальном хосте, этот код выдает исключение с сообщением «Отказано в подключении к хосту: localhost»
5. Вам нужно запустить его на хосте сервера, а не на хосте клиента.
Ответ №1:
Большое спасибо!
Я решил свою проблему именно таким образом.
Во-первых, я отредактировал классы servicebrowser, ServiceServerImpl.
класс servicebrowser:
До того , как:
try {
obj = Naming.lookup("rmi://127.0.0.1/ServiceServer");
}
Теперь (плюс я добавил импорт java.rmi.registry.LocateRegistry, импортируйте java.rmi.registry.Registry в верхнюю часть кода):
try {
Registry registry = LocateRegistry.getRegistry("127.0.0.1", 10001);
obj = registry.lookup("ServiceServer");
}
класс ServiceServerImpl:
До того , как:
try {
Naming.rebind("ServiceServer", new ServiceServerImpl());
}
Теперь (как и в предыдущем классе, я добавил классы импорта в верхнюю часть кода):
try {
Registry registry = LocateRegistry.createRegistry(10001);
registry.bind("ServiceServer", new ServiceServerImpl());
}
Во-вторых, я пытаюсь запустить project (F6) в Netbeans, где servicebrowser помечен как основной класс. Это снова было отказное соединение. После этого я запустил только класс ServiceServerImpl (Shift F6), а затем запустил весь проект. Итак, это работает.
PS Я не использовал cmd и не пытался
«запустить rmiregistry»
потому что приложение работает без него.
Комментарии:
1. Первая серия изменений не имела никакого значения. Код полностью эквивалентен, за исключением того, что вы используете другой порт.
2. Мм… Это может быть правдой, но если я использую другой порт в начальной версии приложения (например, 10001), вот так: obj = Именование. поиск(«rmi://127.0.0.1:10001 / ServiceServer»); и попробуйте запустить класс, а затем запустить весь проект, это привело к «отказу в подключении». Что с этим не так?