我正在开发一个 P2P 简单系统,当客户端在索引服务器上成功定位文件后尝试获取请求的文件时出现问题。通过我已经完成的研究,似乎在绑定到服务器的 rmiregistry 时出现问题,在我的例子中是“CentralIndex”。客户端无法绑定 lookup() 对象。请帮忙!。服务器的代码(工作得很好):
public class CIServer implements SharedInterface{
Hashtable<String,Integer> rmiregistry;
public CIServer(){
super();
this.rmiregistry = new Hashtable<String,Integer>();
}
@Override
public int peerSearch(String filename){
if(rmiregistry.containsKey(filename)){
return rmiregistry.get(filename);
}
System.out.println("The file does not exist.");
return 1000;
}
@Override
public boolean insertToRegistry(int peerID,String filename){
rmiregistry.put(filename, peerID);
return rmiregistry.isEmpty();
}
public static void main(String[] args){
System.setProperty("java.security.policy", "server.policy");
//System.setProperty("java.rmi.server.codebase", "file:/build/classes");
if (System.getSecurityManager() == null){
System.setSecurityManager(new SecurityManager());
}
try{
String servername = "CentralIndex";
SharedInterface handler = new CIServer();
SharedInterface stub = (SharedInterface) UnicastRemoteObject.exportObject(handler,0);
Registry reg = LocateRegistry.getRegistry();
reg.rebind(servername, stub);
System.out.println("CentralIndex service bound");
}catch (Exception e){
System.err.println("CentralIndex exception: ");
e.printStackTrace();
}
}
}
客户代码:
public class RMIClient {
static String ServerName = "CentralIndex";
static int peerID = 1;
static File fileDirectory = new File("Client_files\\");
static String downloadDirectory = "temp";
boolean download(byte[] file, String filename){
BufferedOutputStream out;
try{
out = new BufferedOutputStream
(new FileOutputStream(downloadDirectory+filename));
out.write(file, 0, file.length);
out.flush();
out.close();
}catch (FileNotFoundException e){
System.err.println("This file path does not exist.");
e.printStackTrace();
return false;
}catch (IOException e){
e.printStackTrace();
return false;
}
return true;
}
void directoryCheck(SharedInterface file){
String[] subDirectory = fileDirectory.list();
if (subDirectory == null) {
}else {
for (int c = 0; c < subDirectory.length; c++){
String name = subDirectory[c];
try{
file.insertToRegistry(peerID, name);
}catch (RemoteException e){
System.err.println("Registry error");
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
RMIClient client = new RMIClient();
Scanner in = new Scanner(System.in);
int peerAsServerID = 0;
System.out.println("##############################\n"
+ " Welcome to AARK p2p network. \n"
+ "##############################");
System.out.println("To search a file just\n"
+ " type the name below: \n -->");
String filename = in.nextLine();
System.setProperty("java.security.policy", "client.policy");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
Registry reg = LocateRegistry.getRegistry();
SharedInterface handler = (SharedInterface) reg.lookup(ServerName);
client.directoryCheck(handler);
peerAsServerID = handler.peerSearch(filename);
System.out.println(peerAsServerID);
if (peerAsServerID == 1000){
System.out.println("No such file.");
}else {
System.out.println("File "+filename+" found on peer: "+peerAsServerID);
}
}catch (Exception e){
System.err.println("Handler exception");
e.printStackTrace();
}
try{
if (peerAsServerID == 1000 || peerAsServerID == 0){
System.out.println("File:"+filename+" not found.");
} else{
String clientAsServerName = String.valueOf(peerAsServerID);
Registry reg = LocateRegistry.getRegistry();
Handler stub = (Handler)reg.lookup(clientAsServerName);
byte[] file = stub.obtain(filename);
if (client.download(file,filename)){
System.out.println("Download successful.\n "
+ "The requested file is at your temp folder.");
}else{
System.out.println("Download unsuccessful.\n"
+ " There was a problem. Please try again.");
}
}
}catch (Exception e){
System.err.println("Download exception");
e.printStackTrace();
}
}
}
界面:
public interface SharedInterface extends Remote {
int peerSearch (String filename) throws RemoteException;
boolean insertToRegistry(int peerID, String filename) throws RemoteException;
}
客户端用作服务器的另一个接口:
public interface Handler extends Remote {
byte[] obtain(String filename) throws RemoteException;
}
这就是我最终得到的:
file5.txt
File found on peer: 2
Download exception
java.rmi.NotBoundException: 2
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:136)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at RMIClient2.RMIClient2.main(RMIClient2.java:94)
BUILD SUCCESSFUL (total time: 2 seconds)
请有人帮我尽快解决这个问题!谢谢大家。