ERROR CANNOT FIND SYMBOL when compiling a Java file - java

I want to create a RMI application. I set the java path in the System Variables and started with these steps
javac Hello.java
javac HelloImpl.java
javac HelloServer.java
javac HelloClient.java
start rmiregistry
start java -Djava.security.policy=policy Server
start java -Djava.security.policy=policy Client
But in the second step I have this problem
C:\Users\HP\eclipse\SimpleRMIExample\src>javac Hello.java
C:\Users\HP\eclipse\SimpleRMIExample\src>javac HelloImpl.java
HelloImpl.java:4: error: cannot find symbol
public class HelloImpl extends UnicastRemoteObject implements Hello {
^
symbol: class Hello
1 error
Code
//Hello.java
import java.rmi.*;
public interface Hello extends Remote {
public String getGreeting() throws RemoteException;
}
//HelloImpl.java
import java.rmi.*;
import java.rmi.server.*;
public class HelloImpl extends UnicastRemoteObject implements Hello {
public HelloImpl() throws RemoteException {
// No action needed here.
}
public String getGreeting() throws RemoteException {
return ("Hello there!");
}
}
//HelloServer.java
import java.rmi.*;
public class HelloServer {
private static final String HOST = "localhost";
public static void main(String[] args) throws Exception {
// Create a reference to an implementation object...
HelloImpl temp = new HelloImpl();
// Create the string URL holding the object's name...
String rmiObjectName = "rmi://" + HOST + "/Hello";
// (Could omit host name here, since 'localhost‘ would be assumed by default.)
// 'Bind' the object reference to the name...
Naming.rebind(rmiObjectName, temp);
// Display a message so that we know the process has been completed...
System.out.println("Binding complete...\n");
}
}
//HelloClient.java
import java.rmi.*;
public class HelloClient {
private static final String HOST = "localhost";
public static void main(String[] args) {
try {
// Obtain a reference to the object from the registry and typecast it into the
// appropriate
// type...
Hello greeting = (Hello) Naming.lookup("rmi://" + HOST + "/Hello");
// Use the above reference to invoke the remote object's method...
System.out.println("Message received: " + greeting.getGreeting());
} catch (ConnectException conEx) {
System.out.println("Unable to connect to server!");
System.exit(1);
} catch (Exception ex) {
ex.printStackTrace();
System.exit(1);
}
}
}

Problem finally solved here are the steps
Edit the System Environment Variables -> Environment Variables -> User variables
-> CLASSPATH (add if not found) -> path-project-bin-folder
(C:\Users\HP\eclipse\SimpleRMIExample\bin)
for 1st time only
Reboot
for 1st time only
Clean Project
Command: start rmiregistry (on bin folder of your project)
Run project

Related

How can I call a method from another project in Java using Remote Method Invocation (RMI)?

I am using IntelliJ as my IDE and the code below runs alright if they are in the same src folder. However, what I want is to call the sayHello() method in another project. Is that possible? I thought this is possible since this is what RMI enables, but am I wrong?
I tried to create another project that contains a Main java class and has the same code as the Client Test Drive below, hoping to call the sayHello() method by utilizing Naming.lookup() but it doesn't work! If I try to run it, I was given a java.rmi.UnmarshalException: error unmarshalling return; exception. What am I missing?
How can I call the sayHello() method "remotely"?
Remote Interface:
package Remote;
import java.rmi.*;
public interface HelloRemote extends Remote {
String sayHello() throws RemoteException;
}
Remote Implementation
package Remote;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class HelloRemoteImpl extends UnicastRemoteObject implements HelloRemote{
public HelloRemoteImpl() throws RemoteException {};
#Override
public String sayHello() throws RemoteException {
return "Server says, \"Hello!\"";
}
public static void main(String[] args) {
try {
// 2.3 register the service
HelloRemote service = new HelloRemoteImpl();
final int PORT = 1888;
Registry registry = LocateRegistry.createRegistry(PORT);
registry.rebind("hello", service);
System.out.println("Service running on PORT: " + PORT);
} catch(Exception e) {
e.printStackTrace();
}
}
}
Client Test Drive
package Remote;
import java.rmi.Naming;
public class SayHelloTest {
public static void main(String[] args) {
try {
HelloRemote service = (HelloRemote) Naming.lookup("rmi://127.0.0.1:1888/hello");
String helloStr = service.sayHello();
System.out.println(helloStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Error: Could not find or load main class TestClient

I'm attempting to build a HelloWord websocket client with the example code provided here: https://github.com/Gottox/socket.io-java-client/blob/master/examples/basic/BasicExample.java
The goal is to connect to a Flask server that uses: https://github.com/miguelgrinberg/Flask-SocketIO-Chat The client in python I've built works fine, however I also need to build a java client.
I've seen a lot of different solutions that suggest adding a -cp during compiling, but still get the same message Error: Could not find or load main class TestClient What am I doing wrong?
I'm using this script to compile & run.
#!/bin/sh
export JAVA_HOME="/usr/lib/jvm/java-8-oracle"
/usr/lib/jvm/java-8-oracle/bin/javac TestClient.java -cp /home/erm/git/Flask-SocketIO-Chat/*.jar:*:.:./
echo "exitcode:$?"
/usr/lib/jvm/java-8-oracle/bin/java TestClient
Here's the output:
exitcode:0
Error: Could not find or load main class TestClient
TestClient.java
import io.socket.IOAcknowledge;
import io.socket.IOCallback;
import io.socket.SocketIO;
import io.socket.SocketIOException;
import org.json.JSONException;
import org.json.JSONObject;
public class TestClient implements IOCallback {
private SocketIO socket;
/**
* #param args
*/
public static void main(String[] args) {
System.out.println("Hello, World");
try {
new TestClient();
} catch (Exception e) {
e.printStackTrace();
}
}
public TestClient() throws Exception {
socket = new SocketIO();
socket.connect("http://127.0.0.1:5000/", this);
// Sends a string to the server.
socket.send("Hello Server");
// Sends a JSON object to the server.
socket.send(new JSONObject().put("key", "value").put("key2",
"another value"));
// Emits an event to the server.
socket.emit("event", "argument1", "argument2", 13.37);
}
#Override
public void onMessage(JSONObject json, IOAcknowledge ack) {
try {
System.out.println("Server said:" + json.toString(2));
} catch (JSONException e) {
e.printStackTrace();
}
}
#Override
public void onMessage(String data, IOAcknowledge ack) {
System.out.println("Server said: " + data);
}
#Override
public void onError(SocketIOException socketIOException) {
System.out.println("an Error occured");
socketIOException.printStackTrace();
}
#Override
public void onDisconnect() {
System.out.println("Connection terminated.");
}
#Override
public void onConnect() {
System.out.println("Connection established");
}
#Override
public void on(String event, IOAcknowledge ack, Object... args) {
System.out.println("Server triggered event '" + event + "'");
}
}
The error message
Error: Could not find or load main class TestClient
indicates that the Java launcher can't find/load the class file TestClient.class.
To load it properly both the class file itself and the jar file socketio.jar need to be on the class path. So please try
/usr/lib/jvm/java-8-oracle/bin/java -cp .:socketio.jar TestClient
or
/usr/lib/jvm/java-8-oracle/bin/java -cp /home/erm/git/Flask-SocketIO-Chat:/home/erm/git/Flask-SocketIO-Chat/socketio.jar TestClient
The previous answer should work if the file was missing.
But before that, can you please check if the Java file was compiled as it is being run through shell ???
if not please compile the java file
javac TestClient.java
if you are in the path where TestClient.java is present
or provide the full path eg. javac /app/javafiles/TestClient.java

can't run rmi registry on my system

I am learning RMI concepts and had built a simple program taking reference from head first java. All Went fine the first time i ran the code through command prompt.
the next time I ran code the command:
rmiregistry
took too long to load and nothing happened.
I even tried the solution in this thread but nothing happend.
need help to run RMI Registry
also when i run my server and client file i get this error:
Exception: java.rmi.ConnectException: Connection refused to host: 192.168.1.105; nested exception is:
java.net.ConnectException: Connection refused: connect
My Source Code:
myremote.java
import java.rmi.*;
public interface myremote extends Remote
{
public String sayhello() throws RemoteException;
}
Server.java
import java.rmi.*;
import java.rmi.server.*;
public class Server extends UnicastRemoteObject implements myremote
{
public Server() throws RemoteException{}
public String sayhello()
{
return("Server says hi");
}
public static void main(String args[])
{
try
{
myremote S = new Server();
Naming.rebind("remotehello",S);
}
catch(Exception E)
{
System.out.println("Exception: "+E);
}
}
}
client.java
import java.rmi.*;
public class client
{
public static void main(String[] args)
{
client c = new client();
c.go();
}
public void go()
{
try
{
myremote S=(myremote) Naming.lookup("rmi://127.0.0.1/remotehello");
System.out.println("Output:"+S.sayhello());
}
catch(Exception E)
{
System.out.println("Exception: "+ E);
}
}
}
Can't run RMI registry on my system
You've provided no evidence of that.
took too long to load
I don't know what this means. Evidence?
nothing happened.
Nothing is supposed to happen. The RMI registry doesn't print anything. It just sits there.
Run it and try again. You'll be surprised.

RMI(java.net.ConnectException: Connection refused: connect)

I am trying to run my server named SampleServer. I am using windows and this is what i did:
in cmd:
javaw rmiregistry 1099
cd C:\Users\Home\workspace\RMI\src
java -Djava.security.policy=policy SampleServer 1099
i get the following error:
binding //localhost:1099/Sample
New instance of Sample created
Sample server failed:Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect
I've tried using a different port # such as 4719 for rmiregistry but i receive the same error. I made sure that my firewall was disabled but the problem persist. I made sure that the port is not already being used. I really hope someone can help me.
Picture of my desktop with folders of project, eclipse window and cmd open:
http://s22.postimg.org/uq00qzslr/picyture.png
Code:
SampleServer:
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
public class SampleServer {
public static void main(String args[]) {
if (args.length != 1) {
System.err.println("usage: java SampleServer rmi_port");
System.exit(1);
}
// Create and install a security manager
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try {
// first command-line argument is the port of the rmiregistry
int port = Integer.parseInt(args[0]);
String url = "//localhost:" + port + "/Sample";
System.out.println("binding " + url);
Naming.rebind(url, new Sample());
// Naming.rebind("Sample", new Sample());
System.out.println("server " + url + " is running...");
}
catch (Exception e) {
System.out.println("Sample server failed:" + e.getMessage());
}
}
}
SampleClient:
import java.rmi.Naming;
import java.rmi.RemoteException;
public class SampleClient {
public static void main(String args[]) {
try {
if (args.length < 3) {
System.err.println("usage: java SampleClient host port string... \n");
System.exit(1);
}
int port = Integer.parseInt(args[1]);
String url = "//" + args[0] + ":" + port + "/Sample";
System.out.println("looking up " + url);
SampleInterface sample = (SampleInterface)Naming.lookup(url);
// args[2] onward are the strings we want to reverse
for (int i=2; i < args.length; ++i)
// call the remote method and print the return
System.out.println(sample.invert(args[i]));
} catch(Exception e) {
System.out.println("SampleClient exception: " + e);
}
}
}
SampleInterface:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface SampleInterface extends Remote {
public String invert(String msg) throws RemoteException;
}
Sample:
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.*;
// this is the class with remote methods
public class Sample
extends UnicastRemoteObject
implements SampleInterface {
private int a;
public Sample() throws RemoteException {
System.out.println("New instance of Sample created");
a = 1;
}
public String invert(String m) throws RemoteException {
// return input message with characters reversed
System.out.println("invert("+m+") a=" + a);
return new StringBuffer(m).reverse().toString();
}
}
policy:
grant {
permission java.security.AllPermission;
};
javaw rmiregistry 1099
Stop right there. This is already wrong. 'rmiregistry' is an executable, not the name of a Java class you can execute with 'java' or 'javaw'. Just use 'rmiregistry'.
This error occurs when there is no service running on the port, you are trying to connect. As said by EJP, rmiregistry is a tool which can be started by rmiregistry & in the background (JDK 7). I would recommend you that you check your firewall or connectivity issue with the port.

How to export files from server to client - Java RMI

I am new to Java RMI and I am simply trying to run a "Hello World" program (code is shown at the end of the message)
Basically, I have a remote class, a remote interface, and a server class in one of my computers and a client class in another computer.
I am trying to get a "hello" message from the server using the client.
The problem is that I cannot compile the client and get it running if I don't have the remote interface and the stub in the same directory where the client is, and at the same time I cannot run the server if I don't have those in the same directory that the server is.
I compiled the server/remote class/interface using javac and then using the rmic compiler.
"rmic Hello".
I am wondering how I could get this to work without having to have all the files in both computers (which is why I want to make it distributed)
Thanks in advance!
Code:
Remote Interface:
import java.rmi.*;
//Remote Interface for the "Hello, world!" example.
public interface HelloInterface extends Remote {
public String say() throws RemoteException;
}
Remote class:
import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloInterface {
private String message;
public Hello (String msg) throws RemoteException {
message = msg;
}
public String say() throws RemoteException {
return message;
}
}
Client:
import java.rmi.*;
public class Client
{
public static void main (String[] argv)
{
try
{
HelloInterface hello= (HelloInterface) Naming.lookup(host); //the string representing the host was modified to be posted here
System.out.println (hello.say());
}
catch (Exception e)
{
System.out.println ("Hello Server exception: " + e);
}
}
}
Server:
public static void main (String[] argv) {
try {
Naming.rebind ("Hello", new Hello ("Hello, world!"));
System.out.println ("Hello Server is ready.");
} catch (Exception e) {
System.out.println ("Hello Server failed: " + e);
}
}
My guess would be to simply create identical source at both / either end.
am wondering how I could get this to work without having to have all the files in both computers
You can't. You have to distribute the required class files to the client.
(which is why I want to make it distributed)
Non sequitur.

Categories

Resources