コード例 #1
0
  @Override
  protected void handle(DatagramPacket datagramPacket) throws SignatureException {
    KeyManager keyManager = KeyManager.getInstance();
    RSAPublicKey clientPubKey = (RSAPublicKey) keyManager.getPublicKey(Key.CLIENT);

    byte[] reqBytes = Arrays.copyOf(datagramPacket.getData(), datagramPacket.getLength());
    Request req = new Request(new String(reqBytes), clientPubKey);

    String chainHash = null;

    LOCK.lock();
    try {
      String itemId = req.getItemId().toString();

      System.out.format(
          "received: itemId=%2d, userId=%s, price=%s\n",
          req.getItemId(), req.getUserId(), req.getPrice());

      chainHash = HASHING_CHAIN_TABLE.getLastChainHash(itemId);
      HASHING_CHAIN_TABLE.chain(itemId, Utils.digest(req.toString()));
    } finally {
      LOCK.unlock();
    }

    int currentPrice = PRICE_TABLE.getOrDefault(req.getItemId(), 0);
    int bidderPrice = Integer.decode(req.getPrice());
    boolean bidSuccess = bidderPrice > currentPrice;

    if (bidSuccess) {
      PRICE_TABLE.put(req.getItemId(), bidderPrice);
    }

    System.out.format(
        "decrypted price: %d, now highest price is %d\n",
        bidderPrice, Math.max(bidderPrice, currentPrice));

    Acknowledgement ack = new Acknowledgement(chainHash, bidSuccess, req);

    ack.sign(keyPair, keyInfo);

    try (Socket s = new Socket(datagramPacket.getAddress(), req.getPort());
        DataOutputStream out = new DataOutputStream(s.getOutputStream());
        DataInputStream in = new DataInputStream(s.getInputStream())) {
      Utils.send(out, ack.toString());
    } catch (IOException ex) {
      LOGGER.log(Level.SEVERE, null, ex);
    }
  }