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