Java RMI 服务器不打印输出

Java RMI Server does not print output

我的 RMI 素数程序无法打印服务器中的输出 class。素数范围是从客户端输入的 class.

素数

 package example.primenumbers;

 import java.rmi.Remote;
 import java.rmi.RemoteException;

 public interface PrimeNumber extends Remote{

 public String sayPrimeNumber(int n) throws RemoteException;
  }

Server.java

package example.primenumbers;

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements PrimeNumber{

public Server() {}

public String sayPrimeNumber(){

  int i =0;
  int n =0;
  int num =0;
  String  primeNumbers = "";
  for (i = 1; i <= n; i++)         
  {                   
     int counter=0;           
     for(num =i; num>=1; num--)
     {
    if(i%num==0)
    {
    counter = counter + 1;
    }
 }
 if (counter ==2)
 {
    //Appended the Prime number to the String
    primeNumbers = primeNumbers + i + " ";
 }

  }

      System.out.println("Prime numbers from 1 to n are :");
      System.out.println(primeNumbers);
  return primeNumbers;
    }



public static void main(String args[]) {

    try {
        Server obj = new Server();
        PrimeNumber stub = (PrimeNumber) UnicastRemoteObject.exportObject(obj, 0);

        // Bind the remote object's stub in the registry
        Registry registry = LocateRegistry.getRegistry();
        registry.bind("PrimeNumber", stub);

      System.err.println("Server ready");
    } catch (Exception e) {
        System.err.println("Server exception: " + e.toString());
        e.printStackTrace();
     }
   }
 }

客户

package example.primenumbers;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;

public class Client {

private Client() {}

public static void main(String[] args) 

{
  long startTime = System.nanoTime();

  Scanner scanner = new Scanner(System.in);
  int i =0;
  int num =0;
  //Empty String
  String  primeNumbers = "";
  System.out.println("Enter the value of n:");
  int n = scanner.nextInt();
  scanner.close();
  for (i = 1; i <= n; i++)         
  {                   
     int counter=0;           
     for(num =i; num>=1; num--)
     {
    if(i%num==0)
    {
    counter = counter + 1;
    }
 }
 if (counter ==2)
 {
    //Appended the Prime number to the String
    primeNumbers = primeNumbers + i + " ";
 }  
  } 

    String host = (args.length < 1) ? null : args[0];
    try {
        Registry registry = LocateRegistry.getRegistry(host);
        PrimeNumber stub = (PrimeNumber) registry.lookup("PrimeNumber");
        String response = stub.sayPrimeNumber();

    long endTime = System.nanoTime();
    long duration = (endTime - startTime)/1000000000;

    } catch (Exception e) {
        System.err.println("Client exception: " + e.toString());
        e.printStackTrace();
      }
   }
}

我尝试更改 println 和 return 但仍然没有任何反应。我希望有人能帮助我。另外,这是我第一次做 RMI,所以请原谅我对它的了解。

服务器中的这个循环从不运行

int i =0;
int n =0;
... 
for (i = 1; i <= n;  // here, i < 0 is never true 

您需要将 n 作为参数传递给方法并将其从客户端发送到服务器,而不是仅将其分配给 0

public String sayPrimeNumber(int n){
    int num =0;
    String  primeNumbers = "";
    for (int i = 1; i <= n; i++)        

而在客户端

int n = scanner.nextInt();
stub.sayPrimeNumber(n);

您还需要从客户端移除质数计算并实际打印响应变量

代码有 2 个问题

  • 它总是从0开始运行,因为n在服务器端没有变化,所以没有计算因子,所以输出的都是Prime numbers from 1 to n are :
  • 输出在服务器端,而不是在客户端程序,所以客户端什么都不输出

第一个的修复是将 n 作为参数发送,第二个的修复是发回 return 值并从客户端打印它。

在两者上打印的代码

Client.java

package example.primenumbers;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;

public class Client {

    private Client() {}

    public static void main(final String[] args) {
        final long startTime = System.nanoTime();

        final int n;
        try (Scanner scanner = new Scanner(System.in)) {
            System.out.println("Enter the value of n:");
            n = scanner.nextInt();
        }
        final String host = (args.length < 1) ? null : args[0];
        try {
            final Registry registry = LocateRegistry.getRegistry(host);
            final PrimeNumber stub = (PrimeNumber) registry.lookup("PrimeNumber");
            final String response = stub.sayPrimeNumber(n);

            System.out.println(response);
            final long endTime = System.nanoTime();
            final long duration = (endTime - startTime)/1000000000;
            System.out.println("Took: " + duration);
        } catch (final RemoteException | NotBoundException e) {
            System.err.println("Client exception: " + e);
            e.printStackTrace();
        }
    }
}

PrimeNumber.java

public interface PrimeNumber extends Remote {
    public String sayPrimeNumber(int n) throws RemoteException;
}

Server.java

package example.primenumbers;

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements PrimeNumber{

    public Server() {}

    public String sayPrimeNumber(final int n) throws RemoteException {

        String  primeNumbers = "";
        for (int i = 1; i <= n; i++)
        {
            int counter=0;
            for(int num = i; num>=1; num--)
            {
                if(i%num==0)
                {
                    counter = counter + 1;
                }
            }
            if (counter ==2)
            {
                //Appended the Prime number to the String
                primeNumbers = primeNumbers + i + " ";
            }
        }
        System.out.println("Prime numbers from 1 to n are :");
        System.out.println(primeNumbers);
        return primeNumbers;
    }

    public static void main(final String[] args) {
        try {
            final Server obj = new Server();
            final PrimeNumber stub = (PrimeNumber) UnicastRemoteObject.exportObject(obj, 0);

            // Bind the remote object's stub in the registry
            final Registry registry = LocateRegistry.getRegistry();
            registry.bind("PrimeNumber", stub);

            System.err.println("Server ready");
        } catch (final Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}