本文內容:http://java.sun.com/developer/technicalArticles/tools/JavaSpaces/是一篇如何運行JavaSpaces客戶端的教程。我在Eclipse中編寫了這些類,啓動了Launch-All腳本和Run示例。有用。 之後,我將這些類導出到可執行jar(JavaSpaceClient.jar)中,並使用以下命令嘗試了該jar: java -jar JavaSpaceClient.jar 工作正常,結果爲: 正在搜索JavaSpace ... JavaSpace已被發現。 將消息寫入空間... 從空間讀取消息... 讀取的消息是:ЗдравоJavaSpaceсвете!Jini/JavaSpaces發現錯誤
我的問題是,當我移動我的其他LAN計算機上的這個jar文件時,它顯示我輸入相同的命令時出錯。下面是錯誤:
[email protected]:~/Desktop$ java -jar JavaSpaceClient.jar
Searching for a JavaSpace...
Jul 27, 2011 11:20:54 PM net.jini.discovery.LookupDiscovery$UnicastDiscoveryTask run
INFO: exception occurred during unicast discovery to biske-Inspiron-1525:4160 with constraints InvocationConstraints[reqs: {}, prefs: {}]
java.net.UnknownHostException: biske-Inspiron-1525
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:175)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at com.sun.jini.discovery.internal.MultiIPDiscovery.getSingleResponse(MultiIPDiscovery.java:134)
at com.sun.jini.discovery.internal.MultiIPDiscovery.getResponse(MultiIPDiscovery.java:75)
at net.jini.discovery.LookupDiscovery$UnicastDiscoveryTask.run(LookupDiscovery.java:1756)
at net.jini.discovery.LookupDiscovery$DecodeAnnouncementTask.run(LookupDiscovery.java:1599)
at com.sun.jini.thread.TaskManager$TaskThread.run(TaskManager.java:331)
我只是寫道:「在搜索JavaSpace ......」過了一會打印這些錯誤消息。 有人可以幫我解決這個錯誤嗎?
編輯: 對於發現我使用LookupDiscovery類,我在網上查到:
import java.io.IOException;
import java.rmi.RemoteException;
import net.jini.core.lookup.ServiceRegistrar;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.discovery.LookupDiscovery;
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.DiscoveryEvent;
/**
A class which supports a simple JINI multicast lookup. It doesn't register
with any ServiceRegistrars it simply interrogates each one that's
discovered for a ServiceItem associated with the passed interface class.
i.e. The service needs to already have registered because we won't notice
new arrivals. [ServiceRegistrar is the interface implemented by JINI
lookup services].
@todo Be more dynamic in our lookups - see above
@author Dan Creswell ([email protected])
@version 1.00, 7/9/2003
*/
public class Lookup implements DiscoveryListener {
private ServiceTemplate theTemplate;
private LookupDiscovery theDiscoverer;
private Object theProxy;
/**
@param aServiceInterface the class of the type of service you are
looking for. Class is usually an interface class.
*/
public Lookup(Class aServiceInterface) {
Class[] myServiceTypes = new Class[] {aServiceInterface};
theTemplate = new ServiceTemplate(null, myServiceTypes, null);
}
/**
Having created a Lookup (which means it now knows what type of service
you require), invoke this method to attempt to locate a service
of that type. The result should be cast to the interface of the
service you originally specified to the constructor.
@return proxy for the service type you requested - could be an rmi
stub or an intelligent proxy.
*/
Object getService() {
synchronized(this) {
if (theDiscoverer == null) {
try {
theDiscoverer =
new LookupDiscovery(LookupDiscovery.ALL_GROUPS);
theDiscoverer.addDiscoveryListener(this);
} catch (IOException anIOE) {
System.err.println("Failed to init lookup");
anIOE.printStackTrace(System.err);
}
}
}
return waitForProxy();
}
/**
Location of a service causes the creation of some threads. Call this
method to shut those threads down either before exiting or after a
proxy has been returned from getService().
*/
void terminate() {
synchronized(this) {
if (theDiscoverer != null)
theDiscoverer.terminate();
}
}
/**
Caller of getService ends up here, blocked until we find a proxy.
@return the newly downloaded proxy
*/
private Object waitForProxy() {
synchronized(this) {
while (theProxy == null) {
try {
wait();
} catch (InterruptedException anIE) {
}
}
return theProxy;
}
}
/**
Invoked to inform a blocked client waiting in waitForProxy that
one is now available.
@param aProxy the newly downloaded proxy
*/
private void signalGotProxy(Object aProxy) {
synchronized(this) {
if (theProxy == null) {
theProxy = aProxy;
notify();
}
}
}
/**
Everytime a new ServiceRegistrar is found, we will be called back on
this interface with a reference to it. We then ask it for a service
instance of the type specified in our constructor.
*/
public void discovered(DiscoveryEvent anEvent) {
synchronized(this) {
if (theProxy != null)
return;
}
ServiceRegistrar[] myRegs = anEvent.getRegistrars();
for (int i = 0; i < myRegs.length; i++) {
ServiceRegistrar myReg = myRegs[i];
Object myProxy = null;
try {
myProxy = myReg.lookup(theTemplate);
if (myProxy != null) {
signalGotProxy(myProxy);
break;
}
} catch (RemoteException anRE) {
System.err.println("ServiceRegistrar barfed");
anRE.printStackTrace(System.err);
}
}
}
/**
When a ServiceRegistrar "disappears" due to network partition etc.
we will be advised via a call to this method - as we only care about
new ServiceRegistrars, we do nothing here.
*/
public void discarded(DiscoveryEvent anEvent) {
}
}
我的客戶端程序試圖簡單地搜索JavaSpaces的服務寫MessageEntry進入之後,獲取信息並打印出來。下面是客戶端程序:
import net.jini.space.JavaSpace;
public class SpaceClient {
public static void main(String argv[]) {
try {
MessageEntry msg = new MessageEntry();
msg.content = "Hello JavaSpaces wordls!";
System.out.println("Searching for JavaSpaces...");
Lookup finder = new Lookup(JavaSpace.class);
JavaSpace space = (JavaSpace) finder.getService();
System.out.println("JavaSpaces discovered.");
System.out.println("Writing into JavaSpaces...");
space.write(msg, null, 60*60*1000);
MessageEntry template = new MessageEntry();
System.out.println("Reading message from JavaSpaces...");
MessageEntry result = (MessageEntry) space.read(template, null, Long.MAX_VALUE);
System.out.println("Message: "+result.content);
} catch(Exception e) {
e.printStackTrace();
}
}
}
當然,這並是MessageEntry類:
import net.jini.core.entry.*;
public class MessageEntry implements Entry {
public String content;
public MessageEntry() {
}
public MessageEntry(String content) {
this.content = content;
}
public String toString() {
return "MessageContent: " + content;
}
}
EDIT2: 我沒有發現兩個Windows計算機。 之後,我嘗試Windows - Ubuntu combiantion,它不起作用。也許有一些網絡問題?當我互相ping通時,一切都很好。也許在Ubuntu上有一些DNS問題..
EDIT3: Windows - 如果JavaSpaces服務在Windows上啓動並且客戶端程序在Ubuntu上,則Ubuntu組合可以工作。當我嘗試做相反的事情時,在Ubuntu上運行JavaSpaces服務並在Windows上運行客戶端時發生錯誤。 顯然Ubuntu有一些問題。 Ubuntu默認安裝了OpenJDK。我安裝了Oracle JDK,並設置了JAVA_HOME並將JAVA_HOME/bin放入了PATH變量。不知道Java版本可能存在一些問題,也許我沒有使用正確的版本。
感謝沒有太多的人來幫助JavaSpaces,我感謝您的幫助。我編輯了我的問題,你能告訴我要改變什麼嗎? –
使用示例代碼更新了我的回覆。 –
剛剛看到您正在使用的發現代碼。看起來您正在使用多點傳送發現,但發現主機時發生錯誤。試試@ beny23說的。另外,請嘗試使用您的計算機的IP地址而不是主機名來指定單播發現,以確保沒有某種DNS問題。 –