// Called when a peer we're trying to connect to sends us a message private void processNewPeer(SocketChannel c) throws IOException { ByteBuffer message = ChannelHelper.readBytes(c, 4); String recognize = utf8.decode(message).toString(); if (!recognize.equals("bam!")) { // Connected to something that wasn't a BAMPong client... c.close(); Peer p = new_peers.remove(c); log("Closing attempt to " + p.getName() + " got " + recognize); return; } // Assemble response ByteBuffer name = utf8.encode(nick); message = ByteBuffer.allocateDirect(name.limit() + 10); // id(4), port(4), name(2+limit) message.putInt(id); message.putInt(getPort()); ChannelHelper.putString(message, name); message.flip(); // Send message c.write(message); // Move socket to connected peers. Peer peer = new_peers.remove(c); peers.put(c, peer); sockets.put(peer, c); }
public void buildData() { Peer peer; int size = peerList.size(); data = null; data = new Object[size][6]; for (int i = 0; i < size; i++) { peer = peerList.get(i); data[i][0] = peer.getName(); data[i][1] = String.valueOf(peer.getPonderations().getPonderation(PeerActionKill.class)); data[i][2] = String.valueOf(peer.getPonderations().getPonderation(PeerActionAvg.class)); data[i][3] = String.valueOf(peer.getPonderations().getPonderation(PeerActionTalk.class)); data[i][4] = String.valueOf(peer.getPonderations().getPonderation(PeerActionQuery.class)); data[i][5] = String.valueOf(peer.getPonderations().getPonderation(PeerActionMove.class)); } fireTableChanged(new TableModelEvent(this)); }
// Called when an established peer sends us a message private void processPeerMessage(SocketChannel c) throws IOException { Peer peer = peers.get(c); ByteBuffer b = ByteBuffer.allocateDirect(1); int read = c.read(b); if (read < 0) { c.close(); return; } if (read < 1) return; // No data? b.flip(); byte type = b.get(); switch (type) { case MSG_DEBUG: log(peer.getName() + ": " + ChannelHelper.getString(c)); break; case MSG_BALL: int id = ChannelHelper.getInt(c); double position = ChannelHelper.getDouble(c); double dx = ChannelHelper.getDouble(c); double dy = ChannelHelper.getDouble(c); int D = ChannelHelper.getInt(c); if (listener != null) listener.receiveBall(id, position, dx, dy, D); break; // Dropped ball // Informative to all peers & server // (Maybe implement as passing ball to server?) // Server may respond with “you lose” // Drop player // Paxos confirmation that client is gone // Heartbeat? // Probably only sent in response to drop // Ping/pong messages // Server failure // All peers, send choice of backup default: System.err.println("Unknown peer message: " + type); } }