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