Java RMI 服务器不打印输出

标签 java server rmi

我的 RMI 素数程序无法打印 Server 类中的输出。素数范围是从 Client 类输入的。

素数

 package example.primenumbers;

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

 public interface PrimeNumber extends Remote{

 public String sayPrimeNumber(int n) throws RemoteException;
  }

服务器.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 并返回,但仍然没有发生。我希望有人能帮助我。另外,这是我第一次做 RMI,所以请原谅我在这方面的糟糕知识。

最佳答案

代码有 2 个问题

  • 它总是从0开始,因为n在服务器端没有改变,所以没有计算因子,所以它输出的只是从1到n的素数是:
  • 输出是在服务器端,而不是在客户端程序中,因此客户端什么也不输出

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

在两者上打印的代码

客户端.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;
}

服务器.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();
        }
    }
}

关于Java RMI 服务器不打印输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46743681/

相关文章:

java - 如何在java中获取数组中的第一个和最后一个元素?

java - 'az account list' 的 API 等效项是什么?

javascript - 在新页面中动态生成 HTML(服务器端)

java - ehcache 节点之一错误地尝试连接到 127.0.0.1

Java RMI 和队列问题

java - java中的输入不匹配错误

java - fragment 接口(interface)回调不存储传递的值

java - 如何在 Apache Tomcat 中找到管理控制台?

c++ - tcp 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据

java - 如何确保 RMI 仅使用一组特定的端口?