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();
}
}
}
我的 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();
}
}
}