回调客户端的远程对象
回调客户端的远程对象有问题
要求客户端也在公网开放端口才行
StockQuote.java
package stock;
import java.rmi.*;
/** 客户端的远程对象接口 */
public interface StockQuote extends Remote{
public void quote(String stockSymbol, double price)throws RemoteException;
}
//StockQuoteImpl.java
package stock;
import java.rmi.*;
import java.rmi.server.*;
public class StockQuoteImpl extends UnicastRemoteObject
implements StockQuote{
public StockQuoteImpl()throws RemoteException{}
public void quote(String symbol, double value)throws RemoteException{
System.out.println(symbol+": "+value);
}
}
//StockQuoteRegistry.java
package stock;
import java.rmi.*;
public interface StockQuoteRegistry extends Remote{
public void registerClient(StockQuote client)throws RemoteException;
public void unregisterClient(StockQuote client)throws RemoteException;
}
//StockQuoteRegistryImpl.java
package stock;
import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
public class StockQuoteRegistryImpl extends UnicastRemoteObject
implements StockQuoteRegistry, Runnable{
protected HashSet<StockQuote> clients;
public StockQuoteRegistryImpl()throws RemoteException{
clients = new HashSet<StockQuote>();
}
public void run(){
//创建一些股票代号
String[] symbols = new String[] {"SUNW", "MSFT", "DAL", "WUTK", "SAMY", "KATY"};
Random rand = new Random();
double values[] = new double[symbols.length];
//为每个股票分配任意价格
for(int i=0; i < values.length; i++){
values[i] = 25.0 + rand.nextInt(100);
}
for (;;){
//随机取出一个股票
int sym = rand.nextInt(symbols.length);
// 修改股票的价格
int change = 100 - rand.nextInt(201);
values[sym] = values[sym] + ((double) change) / 100.0;
if (values[sym] < 0) values[sym] = 0.01;
Iterator<StockQuote> iter = clients.iterator();
while (iter.hasNext()){
StockQuote client = iter.next();
try{
client.quote(symbols[sym], values[sym]);
}catch (Exception exc){
System.out.println("删除一个无效的客户");
iter.remove();
}
}
try { Thread.sleep(1000); } catch (Exception ignore) {}
}
}
public void registerClient(StockQuote client)throws RemoteException{
System.out.println("加入一个客户");
clients.add(client);
}
public void unregisterClient(StockQuote client)throws RemoteException{
System.out.println("删除一个客户");
clients.remove(client);
}
}
//SimpleClient.java
package stock;
import java.rmi.*;
import javax.naming.*;
public class SimpleClient{
public static void main( String args[] ){
String url="rmi://localhost/";
try{
Context namingContext=new InitialContext();
StockQuoteRegistry registry=
(StockQuoteRegistry )namingContext.lookup(url+"StockQuoteRegistry");
StockQuote client=new StockQuoteImpl();
registry.registerClient(client);
}catch( Exception e){
e.printStackTrace();
}
}
}
// SimpleServer.java
package stock;
import java.rmi.*;
import javax.naming.*;
public class SimpleServer{
public static void main( String args[] ){
try{
StockQuoteRegistryImpl registry=new StockQuoteRegistryImpl();
Context namingContext=new InitialContext();
namingContext.rebind( "rmi:StockQuoteRegistry", registry);
System.out.println( "服务器注册了一个StockQuoteRegistry对象" );
new Thread(registry).start();
}catch(Exception e){
e.printStackTrace();
}
}
}

浙公网安备 33010602011771号