回调客户端的远程对象

回调客户端的远程对象有问题

要求客户端也在公网开放端口才行 

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

 

posted @ 2018-12-01 14:32  lomt5  阅读(83)  评论(0)    收藏  举报