Witam.
Piszę program w oparciu o mechanizm RMI i mam problem na etapie implementacji interfejsu po stronie serwera. Kod:
import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;
import javax.swing.*;
import interfaces.*;
public class Server implements ComputerManagment {
Server () throws RemoteException
{
UnicastRemoteObject.exportObject(this, 0);
}
public void Hello() throws RemoteException
{
System.out.println("Hello World Sieciowo ;)");
}
public static void main(String[] args) throws RemoteException, MalformedURLException, IOException {
ComputerManagment engine = new Server();
new ServerSocket(1099);
Naming.rebind("//127.0.0.1:1099/Shutdown",engine);
JOptionPane.showMessageDialog(null, "Serwer zainicjowany", "Informacja", JOptionPane.INFORMATION_MESSAGE);
}
}
ComputerManagment to interfejs dziedziczący po Remote, którego będę używał do definiowania metod zdalnych - ale to później, jak już się uda uporać z początkowymi problemami.
Kodu niewiele, bo to w zasadzie początek ;) Uruchamiam program (oczywiście rmiregistry pracuje w tle), coś się niby próbuje liczyć ale po pewnym czasie dostaję wyjątek:
Exception in thread "main" java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.net.SocketTimeoutException: Read timed out
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:286)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:160)
at Server.main(Server.java:29)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
at java.io.DataInputStream.readByte(DataInputStream.java:248)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:228)
... 5 more
Wydaje się więc, że program nie może otrzymać dostępu do zadanego portu. Miałem nadzieję, że utworzenie obiektu ServerSocket(1099) załatwi sprawę jednak nic z tego (bez tego fragmentu otrzymywałem "refused connection" - co w sumie było dość logiczne). Mam na swoim komputerze serwer Apache (w pakiecie WAMP) - tam ustawienie portu, do którego później się odwołuję w programie też nie pomaga. Firewall na potrzeby testów wyłączony całkowicie - również ten systemowy. Prosty skaner portów pokazuje, że zadany port (np. 1099) jest dostępny.
Nie wiem, co robię źle - proszę więc o pomoc ;) To moje pierwsze kroki w programowaniu sieciowym, więc mogłem coś pokręcić - jeżeli ktoś naprowadziłby mnie na dobrą drogę byłbym wdzięczny ;)
EDIT:
Kod zmieniłem na:
public static void main(String[] args) throws RemoteException, MalformedURLException, IOException {
Registry a =LocateRegistry.createRegistry(1099);
ComputerManagment engine = new Server();
a.rebind("//127.0.0.1:1099/Shutdown",engine);
JOptionPane.showMessageDialog(null, "Serwer zainicjowany", "Informacja", JOptionPane.INFORMATION_MESSAGE);
}
...i wygląda na to, że działa w porządku bez uruchamiania nawet rmiregistry.exe - nie rzuca mi żadnym wyjątkiem, wyświetla komunikat - wygląda w porządku, przynajmniej do czasu, aż zabiorę się do programowania klienta. Heh - nieco nietypowa pora na rozwiązywanie takich problemów ale grunt, że chyba dobrze udało mi się to napisać ;)
Temat w takim razie nieaktualny ;)
Pozdrawiam.