我的 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/