Error: Could not find or load main class TestClient - java

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

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 CANNOT FIND SYMBOL when compiling a Java file

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

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.

Exception - java.lang.NoClassDefFoundError

So, i done search for this question..
My directories and files structure looks like (all *.java files have server package):
run2 (shell script)
[server] (folder)
\
\ Server.java
ClientThread.java
ServerConnectionManager.java
.. some other files ...
run2 contains:
find . -name "*.class" -type f -delete
javac -classpath .:server:server/lib/mysqlconn.jar server/Server.java
java -classpath .:server:server/lib/mysqlconn.jar server.Server
As you see, it runs Server. Go look there:
package server;
// imports
public class Server {
public static final int BUFFSIZE = 32;
public static void main (String[] args) throws IOException {
ServerConnectionManager server = new ServerConnectionManager(1234);
server.start();
server.acceptConnections();
server.shutdown();
}
}
Nothing weird in this class, right? Anyway, i think like that.
In this class, as we see, Server create instance of ServerConnectionManager
and call some functions.
Go look at acceptConnections:
public void acceptConnections() {
while(true) {
try {
Socket clientConnection = connection.accept();
ClientThread client = new ClientThread(clientConnection);
/*clients.add(client);
client.start();
System.out.println("[INF] Client connected");
System.out.println("[INF] Summary: " + clients.size() + " clients connected");*/
} catch (IOException e) {
System.out.println("[ERR] Accepting client connection failed");
}
}
}
I commented some lines. I really not need them now.
More about problem:
When i run run2 - server runs and works fine. netstat shows what server wait for connections.
But when i run client, and try connect to server, it shows to me next error:
Exception in thread "main" java.lang.NoClassDefFoundError: server/ClientThread
at server.ServerConnectionManager.acceptConnections(ServerConnectionManager.java:36)
at server.Server.main(Server.java:15)
Caused by: java.lang.ClassNotFoundException: server.ClientThread
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
I can't understand, why i have this exception ?
Look at directories and files. ClientThread.java exists and placed into server directory and have server package. Compilation doesn't show any error.
What i doing wrong?
There is connection class for client
package client;
// imports
public class ClientConnectionManager {
public Socket connection;
public String host;
public Integer port;
public Boolean connected;
public ClientConnectionManager(String h, Integer p) {
host = h;
port = p;
}
public void connect() {
try {
connection = new Socket(host, port);
} catch (IOException e) {
System.out.println("[INF] Failed connect to server");
}
}
public void disconnect() {
try {
connection.close();
} catch (IOException e) {
System.out.println("[ERR] Connection closing failed");
}
}
}
package server;
// some imports just not removed yet
import java.io.IOException;
import java.net.*;
import java.lang.*;
import java.io.*;
import java.util.*;
import java.sql.*;
class ClientThread extends Thread {
public Socket clientSocket;
public OutputStream out;
public InputStream in;
public Tasks tasks;
public User user;
public ClientThread(Socket socket) {
clientSocket = socket;
try {
out = clientSocket.getOutputStream();
in = clientSocket.getInputStream();
} catch (IOException e) {
System.out.println("Cant initialize I/O in for client socket");
}
}
public void run() {
ServerDatabaseConnectionManager database = new ServerDatabaseConnectionManager();
database.connect();
tasks = new Tasks(database.connection);
user = new User(database.connection);
/** listen for requests from client*/
try {
out.write(new String("_nelo_").getBytes());
} catch (IOException e) {
System.out.println("Cant send auth cmd");
}
ServerInputHandler listen = new ServerInputHandler(this);
listen.start();
}
}
You need to compile ClientThread.java as well
add this before running as well
javac -classpath .:server:server/lib/mysqlconn.jar server/ClientThread.java
This is painful way of managing classpath and compilation, better go for some IDE and build tool (maven)
Server.java does not import ClientThread.java or use ClientThread at all inside the Server class, so your compiler ignores compiling it.
In order to fix this problem, simply include ClientThread.java in the batch you use to compile your project.
javac -classpath .:server:server/lib/mysqlconn.jar server/ClientThread.java
I suggest you look into an IDE though

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