/* * (non-Javadoc) * * @see java.lang.Thread#run() */ @Override public void run() { while (requestPacket == null) { try { Thread.sleep(1000); } catch (InterruptedException e) { status = Status.ERROR; return; } if (checkTimeout()) { return; } } status = Status.RUNNING; tftp = new TFTP(); tftp.beginBufferedOps(); tftp.setDefaultTimeout(receiveTimeout * 1000); try { tftp.open(); } catch (SocketException e) { status = Status.ERROR; return; } TFTPPacket packet = requestPacket; TFTPAckPacket ackPacket = new TFTPAckPacket(packet.getAddress(), packet.getPort(), 0); while (packet instanceof TFTPWriteRequestPacket) { try { tftp.bufferedSend(ackPacket); packet = this.getPacket(); } catch (Exception e) { } if (checkTimeout()) { return; } } int lastBlock = 0; while (packet instanceof TFTPDataPacket) { TFTPDataPacket dataPacket = (TFTPDataPacket) packet; int block = dataPacket.getBlockNumber(); if (block > lastBlock || (lastBlock == 65535 && block == 0)) { try { buffer.write( dataPacket.getData(), dataPacket.getDataOffset(), dataPacket.getDataLength()); } catch (IOException e) { status = Status.ERROR; return; } } ackPacket = new TFTPAckPacket(requestPacket.getAddress(), requestPacket.getPort(), block); try { tftp.bufferedSend(ackPacket); } catch (IOException e) { } if (dataPacket.getDataLength() < TFTPDataPacket.MAX_DATA_LENGTH) { this.status = Status.FINISHED; for (int i = 0; i < 3; i++) { try { packet = this.getPacket(); tftp.bufferedSend(ackPacket); } catch (Exception e) { return; } } } try { packet = this.getPacket(); } catch (Exception e) { } if (checkTimeout()) { return; } } status = Status.ERROR; tftp.close(); }