Wersja z użyciem java.util.concurrent na dole.

RMI: Bufor 1-elementowy

Interfejs bufora

import java.io.Serializable;
 
public interface Bufferable extends Serializable
{
 
}

Implementacja interfejsu bufora

public class BufferableInteger implements Bufferable
{
  private static final long serialVersionUID = -3124822365091517613L;
  public int value;
}

Interfejs

import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface RemoteServer extends Remote
{
  public Bufferable get() throws RemoteException;
  public void put(Bufferable o) throws RemoteException;
}

Implementacja serwera

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
 
 
public class ServerImplementation extends UnicastRemoteObject implements RemoteServer
{
  private static final long serialVersionUID = -1205845288411624541L;
  private Bufferable buffer;
 
  protected ServerImplementation() throws RemoteException
  {
    super();
  }
 
  @Override
  synchronized public Bufferable get()
  {
    System.out.println("get");
    return buffer;
  }
 
  @Override
  synchronized public void put(Bufferable o)
  {
    buffer = o;
    System.out.println("put");
  }
}

Przykład programu serwera

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
 
public class Server 
{
  public static void main(String[] args) 
  {
    if (System.getSecurityManager() == null)
    {
      System.setSecurityManager(new RMISecurityManager());
    }
 
    String name = "//localhost:1099/Counter";
    try
    {
      ServerImplementation server = new ServerImplementation();
      Naming.rebind(name, server);
      System.out.println("Server ok");
    }
    catch (Exception e)
    {
      System.err.println("Server excep." + e.getMessage());
      e.printStackTrace();
    }
  }
}

Przykład programu klienta-producenta (dostawcy)

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
 
public class Putter 
{
  public static void main(String[] args) 
  {
    System.out.println("Start");
    if (System.getSecurityManager() == null)
    {
      System.setSecurityManager(new RMISecurityManager());
    }
    try
    {
      String name = "//"+args[0]+"/Counter";
      System.out.println(name);
      RemoteServer server = (RemoteServer) Naming.lookup(name);
      BufferableInteger bi = new BufferableInteger();
      bi.value = Integer.parseInt(args[1]);
      server.put(bi);
      System.out.println("set " + bi.value);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}

Przykład programu klienta-konsumenta (odbiorcy)

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
 
public class Getter 
{
  public static void main(String[] args) 
  {
    System.out.println("Start");
    if (System.getSecurityManager() == null)
    {
      System.setSecurityManager(new RMISecurityManager());
    }
    try
    {
      String name = "//"+args[0]+"/Counter";
      System.out.println(name);
      RemoteServer server = (RemoteServer) Naming.lookup(name);
      BufferableInteger bi = (BufferableInteger)(server.get());
      System.out.println(bi.value);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}

RMI: Bufor 1-elementowy z JUC

Interfejs bufora

import java.io.Serializable;
 
 
public interface IBufferable extends Serializable {
 
}

Implementacja interfejsu bufora

public class BufferableInteger implements IBufferable {
 
  public int value;
}

Interfejs

import java.rmi.Remote;
 
public interface IBuffer extends Remote{
 
  public void putValue(IBufferable value) throws Exception;
	public IBufferable getValue() throws Exception;
}

Implementacja serwera

import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class Server extends UnicastRemoteObject implements IBuffer {
  private IBufferable value;
	private int count = 0;
	private final Lock mutex = new ReentrantLock();
	private final Condition event = mutex.newCondition();
 
	public Server() throws RemoteException {
	}
 
	public static void main(String args[]) {
 
		if (System.getSecurityManager() == null) {
			System.setSecurityManager(new RMISecurityManager());
		}
 
		try {
			Server serv = new Server();
			Registry r = LocateRegistry.createRegistry(6001);
			r.rebind("Server", serv);
 
		} catch (Exception e) {
			System.err.println("Błąd" + e);
		}
	}
 
	@Override
	public void putValue(IBufferable value) {
		try {
			mutex.lock();
			while (count != 0)
				event.await();
			this.value = value;
			count++;
			event.signal();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			mutex.unlock();
		}
	}
 
	@Override
	public IBufferable getValue() {
		IBufferable result;
		try {
			mutex.lock();
			while (count == 0)
				event.await();
			result = this.value;
			count--;
			event.signal();
		} catch (InterruptedException e) {
			e.printStackTrace();
			return null;
		} finally {
			mutex.unlock();
		}
		return result;
	}
}

Implementacja klienta

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
 
public class Client {
 
  public static void main(String args[]) {
		if (System.getSecurityManager() == null) {
			System.setSecurityManager(new RMISecurityManager());
		}
 
		Client c1 = new Client();
		try {
			IBuffer obj = (IBuffer) Naming.lookup("//localhost:6001/Server");
 
			BufferableInteger foo = new BufferableInteger();
			foo.value = 105;
			obj.putValue(foo);
			System.out.println(((BufferableInteger)obj.getValue()).value);
 
 
		} catch (Exception e) {
			System.err.println("Błąd: " + e.getMessage());
			e.printStackTrace();
		}
	}
 
}
rmi/bufor.txt · ostatnio zmienione: 2012/11/14 18:29 przez inf89776
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki