| 32 |
|
public PeerHandler(Socket socket) throws IOException { |
| 33 |
|
super(socket); |
| 34 |
|
// setup reader & writer |
| 35 |
< |
_socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream())); |
| 35 |
> |
_objectOut = new ObjectOutputStream(_socket.getOutputStream()); |
| 36 |
> |
_objectIn = new ObjectInputStream(_socket.getInputStream()); |
| 37 |
|
_logger.write(toString(), Logger.SYSINIT, "created"); |
| 38 |
|
} |
| 39 |
|
|
| 42 |
|
public void run() { |
| 43 |
|
_logger.write(toString(), Logger.SYSINIT, "started"); |
| 44 |
|
try { |
| 45 |
< |
|
| 45 |
> |
|
| 46 |
|
while(_running) { |
| 47 |
|
// VERY basic protocol, only allow sending of agents ;-) |
| 48 |
< |
getInBoundMessage("SENDAGENT"); |
| 49 |
< |
receiveAgent(); |
| 48 |
> |
try { |
| 49 |
> |
String message = (String) _objectIn.readObject(); |
| 50 |
> |
if (message.equals("SENDAGENT")) { |
| 51 |
> |
receiveAgent(); |
| 52 |
> |
} else { |
| 53 |
> |
_logger.write(toString(), Logger.ERROR, "protocol error expected: SENDAGENT got: " + message); |
| 54 |
> |
} |
| 55 |
> |
} catch (ClassNotFoundException e) { |
| 56 |
> |
_logger.write(toString(), Logger.ERROR, "object protocol error expected: a String got: a " + e.getMessage()); |
| 57 |
> |
} |
| 58 |
|
} |
| 59 |
|
|
| 60 |
|
} catch (IOException e) { |
| 76 |
|
// stream types (ie, objectstream and printwriter) can be used together |
| 77 |
|
// needs investigating |
| 78 |
|
|
| 79 |
< |
PrintWriter socketOut = new PrintWriter(_socket.getOutputStream(), true); |
| 80 |
< |
socketOut.println("SENDAGENT"); |
| 81 |
< |
socketOut.close(); |
| 73 |
< |
|
| 79 |
> |
_objectOut.writeObject("SENDAGENT"); |
| 80 |
> |
_objectOut.flush(); |
| 81 |
> |
|
| 82 |
|
// send agent bytecode |
| 83 |
|
|
| 84 |
< |
// TODO |
| 84 |
> |
// TODO - very dodgy and crude at the moment. |
| 85 |
> |
AgentClassLoader cl = new AgentClassLoader(ClassLoader.getSystemClassLoader()); |
| 86 |
|
|
| 87 |
+ |
// send the super class |
| 88 |
+ |
byte[] byteCode = cl.getBytecode(agent.getClass().getSuperclass().getName()); |
| 89 |
+ |
_objectOut.writeInt(byteCode.length); |
| 90 |
+ |
_objectOut.flush(); |
| 91 |
+ |
_objectOut.write(byteCode); |
| 92 |
+ |
_objectOut.flush(); |
| 93 |
+ |
|
| 94 |
+ |
// send the agent |
| 95 |
+ |
byteCode = cl.getBytecode(agent.getClass().getName()); |
| 96 |
+ |
_objectOut.writeInt(byteCode.length); |
| 97 |
+ |
_objectOut.flush(); |
| 98 |
+ |
_objectOut.write(byteCode); |
| 99 |
+ |
_objectOut.flush(); |
| 100 |
+ |
|
| 101 |
|
// send agent state (serialized object) |
| 79 |
– |
ObjectOutputStream objectOutStream = new ObjectOutputStream(_socket.getOutputStream()); |
| 80 |
– |
AgentStation.getInstance().removeAgent(agent); |
| 81 |
– |
objectOutStream.writeObject(agent); |
| 82 |
– |
objectOutStream.flush(); |
| 83 |
– |
objectOutStream.close(); |
| 102 |
|
|
| 103 |
+ |
AgentStation.getInstance().removeAgent(agent); |
| 104 |
+ |
_objectOut.writeObject(agent); |
| 105 |
+ |
_objectOut.flush(); |
| 106 |
+ |
|
| 107 |
|
_logger.write(toString(), Logger.SYSMSG, "agent sent"); |
| 108 |
|
result = true; |
| 109 |
|
} catch (IOException e) { |
| 146 |
|
private void receiveAgent() throws IOException { |
| 147 |
|
_logger.write(toString(), Logger.SYSMSG, "starting agent transfer - inbound"); |
| 148 |
|
try { |
| 149 |
+ |
// TODO - very crude |
| 150 |
|
// receive agent bytecode |
| 151 |
+ |
AgentClassLoader cl = new AgentClassLoader(ClassLoader.getSystemClassLoader()); |
| 152 |
|
|
| 153 |
< |
// TODO |
| 153 |
> |
// first the super class |
| 154 |
> |
int givenLength = _objectIn.readInt(); |
| 155 |
> |
byte[] byteCode = new byte[givenLength]; |
| 156 |
> |
_objectIn.readFully(byteCode); |
| 157 |
> |
cl.defineAgentClass(byteCode); |
| 158 |
> |
|
| 159 |
> |
// then the agent |
| 160 |
> |
|
| 161 |
> |
givenLength = _objectIn.readInt(); |
| 162 |
> |
byteCode = new byte[givenLength]; |
| 163 |
> |
_objectIn.readFully(byteCode); |
| 164 |
> |
cl.defineAgentClass(byteCode); |
| 165 |
> |
|
| 166 |
|
|
| 167 |
|
// receive agent state (serialized object) |
| 168 |
< |
ObjectInputStream objectInStream = new ObjectInputStream(_socket.getInputStream()); |
| 133 |
< |
Agent agent = (Agent) objectInStream.readObject(); |
| 168 |
> |
Agent agent = (Agent) _objectIn.readObject(); |
| 169 |
|
AgentStation.getInstance().addAgent(agent); |
| 170 |
|
|
| 171 |
|
_logger.write(toString(), Logger.DEBUG, "Agent state received"); |
| 180 |
|
Thread thread = new Thread(agent); |
| 181 |
|
thread.start(); |
| 182 |
|
|
| 148 |
– |
objectInStream.close(); |
| 183 |
|
_logger.write(toString(), Logger.SYSMSG, "agent received"); |
| 184 |
|
|
| 185 |
|
} catch (ClassNotFoundException e) { |
| 187 |
|
} |
| 188 |
|
} |
| 189 |
|
|
| 156 |
– |
/** |
| 157 |
– |
* Get the next inbound string from the socket and expect it |
| 158 |
– |
* to be the given text. |
| 159 |
– |
* |
| 160 |
– |
* @param expected the expected text |
| 161 |
– |
* |
| 162 |
– |
* @throws IOException on I/O error or protocol error |
| 163 |
– |
*/ |
| 164 |
– |
private String getInBoundMessage(String expected) throws IOException { |
| 165 |
– |
// grab the input |
| 166 |
– |
String inBound = getInBoundMessage(); |
| 167 |
– |
// check if it's what we're expecting |
| 168 |
– |
if(!inBound.equals(expected)) { |
| 169 |
– |
throw new IOException("protocol error - expected:" + expected + " got:" + inBound); |
| 170 |
– |
} |
| 171 |
– |
// it should be ok then |
| 172 |
– |
return inBound; |
| 173 |
– |
} |
| 174 |
– |
|
| 175 |
– |
/** |
| 176 |
– |
* Get the next inbound string from the socket. |
| 177 |
– |
* |
| 178 |
– |
* @throws IOException on I/O error or protocol error |
| 179 |
– |
*/ |
| 180 |
– |
private String getInBoundMessage() throws IOException { |
| 181 |
– |
// grab the input |
| 182 |
– |
String inBound = _socketIn.readLine(); |
| 183 |
– |
// check for null's, likely disconnection |
| 184 |
– |
if(inBound == null) { |
| 185 |
– |
throw new IOException("got null from peer, maybe it died"); |
| 186 |
– |
} |
| 187 |
– |
// it's a valid message it seems |
| 188 |
– |
return inBound; |
| 189 |
– |
} |
| 190 |
– |
|
| 190 |
|
//---ACCESSOR/MUTATOR METHODS--- |
| 191 |
|
|
| 192 |
|
//---ATTRIBUTES--- |
| 217 |
|
/** |
| 218 |
|
* Used for the input stream of this socket |
| 219 |
|
*/ |
| 220 |
< |
private BufferedReader _socketIn; |
| 221 |
< |
|
| 220 |
> |
private ObjectInputStream _objectIn; |
| 221 |
> |
|
| 222 |
> |
/** |
| 223 |
> |
* Used for the output stream of this socket |
| 224 |
> |
*/ |
| 225 |
> |
private ObjectOutputStream _objectOut; |
| 226 |
> |
|
| 227 |
|
//---STATIC ATTRIBUTES--- |
| 228 |
|
|
| 229 |
|
} |