tftpclient.java

来自「apache推出的net包」· Java 代码 · 共 576 行 · 第 1/2 页

JAVA
576
字号
     * @param filename The name of the file to receive.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param output   The OutputStream to which the file should be written.     * @param hostname The name of the remote host serving the file.     * @param port     The port number of the remote TFTP server.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     * @exception UnknownHostException  If the hostname cannot be resolved.     ***/    public int receiveFile(String filename, int mode, OutputStream output,                           String hostname, int port)    throws UnknownHostException, IOException    {        return receiveFile(filename, mode, output, InetAddress.getByName(hostname),                           port);    }    /***     * Same as calling receiveFile(filename, mode, output, host, TFTP.DEFAULT_PORT).     *     * @param filename The name of the file to receive.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param output   The OutputStream to which the file should be written.     * @param host     The remote host serving the file.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     ***/    public int receiveFile(String filename, int mode, OutputStream output,                           InetAddress host)    throws IOException    {        return receiveFile(filename, mode, output, host, DEFAULT_PORT);    }    /***     * Same as calling receiveFile(filename, mode, output, hostname, TFTP.DEFAULT_PORT).     *     * @param filename The name of the file to receive.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param output   The OutputStream to which the file should be written.     * @param hostname The name of the remote host serving the file.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     * @exception UnknownHostException  If the hostname cannot be resolved.     ***/    public int receiveFile(String filename, int mode, OutputStream output,                           String hostname)    throws UnknownHostException, IOException    {        return receiveFile(filename, mode, output, InetAddress.getByName(hostname),                           DEFAULT_PORT);    }    /***     * Requests to send a file to a remote host, reads the file from an     * InputStream, sends the file to the remote host, and closes the     * connection.  A local UDP socket must first be created by     * {@link org.apache.commons.net.DatagramSocketClient#open open()} before     * invoking this method.  This method will not close the InputStream     * containing the file; you must close it after the method invocation.     * <p>     * @param filename The name the remote server should use when creating     *        the file on its file system.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param host     The remote host receiving the file.     * @param port     The port number of the remote TFTP server.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     ***/    public void sendFile(String filename, int mode, InputStream input,                         InetAddress host, int port) throws IOException    {        int bytesRead, timeouts, lastBlock, block, hostPort, dataLength, offset;        TFTPPacket sent, received = null;        TFTPErrorPacket error;        TFTPDataPacket data =            new TFTPDataPacket(host, port, 0, _sendBuffer, 4, 0);        ;        TFTPAckPacket ack;        beginBufferedOps();        dataLength = lastBlock = hostPort = bytesRead = 0;        block = 0;        boolean lastAckWait = false;        if (mode == TFTP.ASCII_MODE)            input = new ToNetASCIIInputStream(input);        sent =            new TFTPWriteRequestPacket(host, port, filename, mode);_sendPacket:        do        {            bufferedSend(sent);_receivePacket:            while (true)            {                timeouts = 0;                while (timeouts < __maxTimeouts)                {                    try                    {                        received = bufferedReceive();                        break;                    }                    catch (SocketException e)                    {                        if (++timeouts >= __maxTimeouts)                        {                            endBufferedOps();                            throw new IOException("Connection timed out.");                        }                        continue;                    }                    catch (InterruptedIOException e)                    {                        if (++timeouts >= __maxTimeouts)                        {                            endBufferedOps();                            throw new IOException("Connection timed out.");                        }                        continue;                    }                    catch (TFTPPacketException e)                    {                        endBufferedOps();                        throw new IOException("Bad packet: " + e.getMessage());                    }                }                // The first time we receive we get the port number and        // answering host address (for hosts with multiple IPs)                if (lastBlock == 0)                {                    hostPort = received.getPort();                    data.setPort(hostPort);                    if(!host.equals(received.getAddress()))                    {                        host = received.getAddress();                        data.setAddress(host);                        sent.setAddress(host);                    }                }                // Comply with RFC 783 indication that an error acknowledgement                // should be sent to originator if unexpected TID or host.                if (host.equals(received.getAddress()) &&                        received.getPort() == hostPort)                {                    switch (received.getType())                    {                    case TFTPPacket.ERROR:                        error = (TFTPErrorPacket)received;                        endBufferedOps();                        throw new IOException("Error code " + error.getError() +                                              " received: " + error.getMessage());                    case TFTPPacket.ACKNOWLEDGEMENT:                        ack = (TFTPAckPacket)received;                        lastBlock = ack.getBlockNumber();                        if (lastBlock == block)                        {                            ++block;                            if (lastAckWait)                              break _sendPacket;                            else                              break _receivePacket;                        }                        else                        {                            discardPackets();                            if (lastBlock == (block - 1))                                continue _sendPacket;  // Resend last acknowledgement.                            continue _receivePacket; // Start fetching packets again.                        }                        //break;                    default:                        endBufferedOps();                        throw new IOException("Received unexpected packet type.");                    }                }                else                {                    error = new TFTPErrorPacket(received.getAddress(),                                                received.getPort(),                                                TFTPErrorPacket.UNKNOWN_TID,                                                "Unexpected host or port.");                    bufferedSend(error);                    continue _sendPacket;                }                // We should never get here, but this is a safety to avoid                // infinite loop.  If only Java had the goto statement.                //break;            }            dataLength = TFTPPacket.SEGMENT_SIZE;            offset = 4;            while (dataLength > 0 &&                    (bytesRead = input.read(_sendBuffer, offset, dataLength)) > 0)            {                offset += bytesRead;                dataLength -= bytesRead;            }            data.setBlockNumber(block);            data.setData(_sendBuffer, 4, offset - 4);            sent = data;        }        while (dataLength == 0 || lastAckWait);        endBufferedOps();    }    /***     * Requests to send a file to a remote host, reads the file from an     * InputStream, sends the file to the remote host, and closes the     * connection.  A local UDP socket must first be created by     * {@link org.apache.commons.net.DatagramSocketClient#open open()} before     * invoking this method.  This method will not close the InputStream     * containing the file; you must close it after the method invocation.     * <p>     * @param filename The name the remote server should use when creating     *        the file on its file system.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param hostname The name of the remote host receiving the file.     * @param port     The port number of the remote TFTP server.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     * @exception UnknownHostException  If the hostname cannot be resolved.     ***/    public void sendFile(String filename, int mode, InputStream input,                         String hostname, int port)    throws UnknownHostException, IOException    {        sendFile(filename, mode, input, InetAddress.getByName(hostname), port);    }    /***     * Same as calling sendFile(filename, mode, input, host, TFTP.DEFAULT_PORT).     *     * @param filename The name the remote server should use when creating     *        the file on its file system.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param host     The name of the remote host receiving the file.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     * @exception UnknownHostException  If the hostname cannot be resolved.     ***/    public void sendFile(String filename, int mode, InputStream input,                         InetAddress host)    throws IOException    {        sendFile(filename, mode, input, host, DEFAULT_PORT);    }    /***     * Same as calling sendFile(filename, mode, input, hostname, TFTP.DEFAULT_PORT).     *     * @param filename The name the remote server should use when creating     *        the file on its file system.     * @param mode     The TFTP mode of the transfer (one of the MODE constants).     * @param hostname The name of the remote host receiving the file.     * @exception IOException If an I/O error occurs.  The nature of the     *            error will be reported in the message.     * @exception UnknownHostException  If the hostname cannot be resolved.     ***/    public void sendFile(String filename, int mode, InputStream input,                         String hostname)    throws UnknownHostException, IOException    {        sendFile(filename, mode, input, InetAddress.getByName(hostname),                 DEFAULT_PORT);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?