--- experimental/agents/PeerHandler.java 2001/05/04 02:04:35 1.1 +++ experimental/agents/PeerHandler.java 2001/05/06 19:01:48 1.2 @@ -14,7 +14,7 @@ import java.net.Socket; * agent stations. * * @author $Author: ajm $ - * @version $Id: PeerHandler.java,v 1.1 2001/05/04 02:04:35 ajm Exp $ + * @version $Id: PeerHandler.java,v 1.2 2001/05/06 19:01:48 ajm Exp $ */ class PeerHandler extends Handler { @@ -23,7 +23,7 @@ class PeerHandler extends Handler { /** * The current CVS revision of this class */ - public static final String REVISION = "$Revision: 1.1 $"; + public static final String REVISION = "$Revision: 1.2 $"; //---STATIC METHODS--- @@ -32,7 +32,8 @@ class PeerHandler extends Handler { public PeerHandler(Socket socket) throws IOException { super(socket); // setup reader & writer - _socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream())); + _objectOut = new ObjectOutputStream(_socket.getOutputStream()); + _objectIn = new ObjectInputStream(_socket.getInputStream()); _logger.write(toString(), Logger.SYSINIT, "created"); } @@ -41,11 +42,19 @@ class PeerHandler extends Handler { public void run() { _logger.write(toString(), Logger.SYSINIT, "started"); try { - + while(_running) { // VERY basic protocol, only allow sending of agents ;-) - getInBoundMessage("SENDAGENT"); - receiveAgent(); + try { + String message = (String) _objectIn.readObject(); + if (message.equals("SENDAGENT")) { + receiveAgent(); + } else { + _logger.write(toString(), Logger.ERROR, "protocol error expected: SENDAGENT got: " + message); + } + } catch (ClassNotFoundException e) { + _logger.write(toString(), Logger.ERROR, "object protocol error expected: a String got: a " + e.getMessage()); + } } } catch (IOException e) { @@ -67,21 +76,34 @@ class PeerHandler extends Handler { // stream types (ie, objectstream and printwriter) can be used together // needs investigating - PrintWriter socketOut = new PrintWriter(_socket.getOutputStream(), true); - socketOut.println("SENDAGENT"); - socketOut.close(); - + _objectOut.writeObject("SENDAGENT"); + _objectOut.flush(); + // send agent bytecode - // TODO + // TODO - very dodgy and crude at the moment. + AgentClassLoader cl = new AgentClassLoader(ClassLoader.getSystemClassLoader()); + // send the super class + byte[] byteCode = cl.getBytecode(agent.getClass().getSuperclass().getName()); + _objectOut.writeInt(byteCode.length); + _objectOut.flush(); + _objectOut.write(byteCode); + _objectOut.flush(); + + // send the agent + byteCode = cl.getBytecode(agent.getClass().getName()); + _objectOut.writeInt(byteCode.length); + _objectOut.flush(); + _objectOut.write(byteCode); + _objectOut.flush(); + // send agent state (serialized object) - ObjectOutputStream objectOutStream = new ObjectOutputStream(_socket.getOutputStream()); - AgentStation.getInstance().removeAgent(agent); - objectOutStream.writeObject(agent); - objectOutStream.flush(); - objectOutStream.close(); + AgentStation.getInstance().removeAgent(agent); + _objectOut.writeObject(agent); + _objectOut.flush(); + _logger.write(toString(), Logger.SYSMSG, "agent sent"); result = true; } catch (IOException e) { @@ -124,13 +146,26 @@ class PeerHandler extends Handler { private void receiveAgent() throws IOException { _logger.write(toString(), Logger.SYSMSG, "starting agent transfer - inbound"); try { + // TODO - very crude // receive agent bytecode + AgentClassLoader cl = new AgentClassLoader(ClassLoader.getSystemClassLoader()); - // TODO + // first the super class + int givenLength = _objectIn.readInt(); + byte[] byteCode = new byte[givenLength]; + _objectIn.readFully(byteCode); + cl.defineAgentClass(byteCode); + + // then the agent + + givenLength = _objectIn.readInt(); + byteCode = new byte[givenLength]; + _objectIn.readFully(byteCode); + cl.defineAgentClass(byteCode); + // receive agent state (serialized object) - ObjectInputStream objectInStream = new ObjectInputStream(_socket.getInputStream()); - Agent agent = (Agent) objectInStream.readObject(); + Agent agent = (Agent) _objectIn.readObject(); AgentStation.getInstance().addAgent(agent); _logger.write(toString(), Logger.DEBUG, "Agent state received"); @@ -145,7 +180,6 @@ class PeerHandler extends Handler { Thread thread = new Thread(agent); thread.start(); - objectInStream.close(); _logger.write(toString(), Logger.SYSMSG, "agent received"); } catch (ClassNotFoundException e) { @@ -153,41 +187,6 @@ class PeerHandler extends Handler { } } - /** - * Get the next inbound string from the socket and expect it - * to be the given text. - * - * @param expected the expected text - * - * @throws IOException on I/O error or protocol error - */ - private String getInBoundMessage(String expected) throws IOException { - // grab the input - String inBound = getInBoundMessage(); - // check if it's what we're expecting - if(!inBound.equals(expected)) { - throw new IOException("protocol error - expected:" + expected + " got:" + inBound); - } - // it should be ok then - return inBound; - } - - /** - * Get the next inbound string from the socket. - * - * @throws IOException on I/O error or protocol error - */ - private String getInBoundMessage() throws IOException { - // grab the input - String inBound = _socketIn.readLine(); - // check for null's, likely disconnection - if(inBound == null) { - throw new IOException("got null from peer, maybe it died"); - } - // it's a valid message it seems - return inBound; - } - //---ACCESSOR/MUTATOR METHODS--- //---ATTRIBUTES--- @@ -218,8 +217,13 @@ class PeerHandler extends Handler { /** * Used for the input stream of this socket */ - private BufferedReader _socketIn; - + private ObjectInputStream _objectIn; + + /** + * Used for the output stream of this socket + */ + private ObjectOutputStream _objectOut; + //---STATIC ATTRIBUTES--- }