📄 ftpclient.java
字号:
*
* @throws IOException Thrown if there is a TCP/IP-related error.
* @throws FTPException Thrown if there is an error related to the FTP protocol.
*/
public void connect() throws IOException, FTPException {
checkConnection(false);
log.debug("Connecting to " + remoteAddr + ":" + controlPort);
initialize(new FTPControlSocket(remoteAddr, controlPort, timeout,
controlEncoding, messageListener));
}
/**
* Is this client connected?
*
* @return true if connected, false otherwise
*/
public boolean connected() {
if (control==null)
return false;
else {
try {
if (!SocketUtils.isConnected(control.controlSock)) {
control = null;
return false;
}
else {
return true;
}
}
catch (IOException e) {
return false;
}
}
}
/**
* Checks if the client has connected to the server and throws an exception if it hasn't.
* This is only intended to be used by subclasses
*
* @throws FTPException Thrown if the client has not connected to the server.
*/
protected void checkConnection(boolean shouldBeConnected) throws FTPException {
if (shouldBeConnected && !connected())
throw new FTPException("The FTP client has not yet connected to the server. "
+ "The requested action cannot be performed until after a connection has been established.");
else if (!shouldBeConnected && connected())
throw new FTPException("The FTP client has already been connected to the server. "
+"The requested action must be performed before a connection is established.");
}
/**
* Set the control socket explicitly
*
* @param control control socket reference
*/
protected void initialize(FTPControlSocket control) throws IOException {
this.control = control;
control.setMessageListener(messageListener);
control.setStrictReturnCodes(strictReturnCodes);
control.setListenOnAllInterfaces(listenOnAllInterfaces);
control.setTimeout(timeout);
control.setAutoPassiveIPSubstitution(autoPassiveIPSubstitution);
if (activeIP != null)
control.setActivePortIPAddress(activeIP);
if (lowPort > 0 && highPort > 0)
control.setActivePortRange(lowPort, highPort);
}
/**
* Switch debug of responses on or off
*
* @param on true if you wish to have responses to
* the log stream, false otherwise
* @deprecated use the Logger class to switch debugging on and off
*/
public void debugResponses(boolean on) {
if (on)
Logger.setLevel(Level.DEBUG);
else
Logger.setLevel(Level.OFF);
}
/**
* Get the identifying string for this instance
*/
public String getId() {
return id;
}
/**
* Set the identifying string for this instance
*
* @param id identifying string
*/
public void setId(String id) {
this.id = id;
}
/**
* Get the number of files downloaded since the count was
* reset
*
* @return download file count
*/
public int getDownloadCount() {
return downloadCount;
}
/**
* Reset the count of downloaded files to zero.
*
*/
public void resetDownloadCount() {
downloadCount = 0;
}
/**
* Get the number of files uploaded since the count was
* reset
*
* @return upload file count
*/
public int getUploadCount() {
return uploadCount;
}
/**
* Reset the count of uploaded files to zero.
*
*/
public void resetUploadCount() {
uploadCount = 0;
}
/**
* Get the number of files deleted since the count was
* reset
*
* @return deleted file count
*/
public int getDeleteCount() {
return deleteCount;
}
/**
* Reset the count of deleted files to zero.
*
*/
public void resetDeleteCount() {
deleteCount = 0;
}
/**
* Set strict checking of FTP return codes. If strict
* checking is on (the default) code must exactly match the expected
* code. If strict checking is off, only the first digit must match.
*
* @param strict true for strict checking, false for loose checking
*/
public void setStrictReturnCodes(boolean strict) {
this.strictReturnCodes = strict;
if (control != null)
control.setStrictReturnCodes(strict);
}
/**
* Determine if strict checking of return codes is switched on. If it is
* (the default), all return codes must exactly match the expected code.
* If strict checking is off, only the first digit must match.
*
* @return true if strict return code checking, false if non-strict.
*/
public boolean isStrictReturnCodes() {
return strictReturnCodes;
}
/**
* Listen on all interfaces for active mode transfers (the default).
*
* @param listenOnAll true if listen on all interfaces, false to listen on the control interface
*/
public void setListenOnAllInterfaces(boolean listenOnAll) {
this.listenOnAllInterfaces = listenOnAll;
if (control != null)
control.setListenOnAllInterfaces(listenOnAll);
}
/**
* Are we listening on all interfaces in active mode, which is the default?
*
* @return true if listening on all interfaces, false if listening just on the control interface
*/
public boolean getListenOnAllInterfaces() {
return listenOnAllInterfaces;
}
/**
* Get class that holds fragments of server messages that indicate a file was
* not found. New messages can be added.
* <p>
* The fragments are used when it is necessary to examine the message
* returned by a server to see if it is saying a file was not found.
* If an FTP server is returning a different message that still clearly
* indicates a file was not found, use this property to add a new server
* fragment to the repository via the add method. It would be helpful to
* email support at enterprisedt dot com to inform us of the message so
* it can be added to the next build.
*
* @return messages class
*/
public FileNotFoundStrings getFileNotFoundMessages() {
return fileNotFoundStrings;
}
/**
* Set a new instance of the strings class
*
* @param fileNotFoundStrings new instance
*/
public void setFileNotFoundMessages(FileNotFoundStrings fileNotFoundStrings) {
this.fileNotFoundStrings = fileNotFoundStrings;
}
/**
* Get class that holds fragments of server messages that indicate a transfer completed.
* New messages can be added.
* <p>
* The fragments are used when it is necessary to examine the message
* returned by a server to see if it is saying a transfer completed.
* If an FTP server is returning a different message that still clearly
* indicates a transfer failed, use this property to add a new server
* fragment to the repository via the add method. It would be helpful to
* email support at enterprisedt dot com to inform us of the message so
* it can be added to the next build.
*
* @return messages class
*/
public TransferCompleteStrings getTransferCompleteMessages() {
return transferCompleteStrings;
}
/**
* Set a new instance of the strings class
*
* @param transferCompleteStrings new instance
*/
public void setTransferCompleteMessages(TransferCompleteStrings transferCompleteStrings) {
this.transferCompleteStrings = transferCompleteStrings;
}
/**
* Get class that holds fragments of server messages that indicate a
* directory is empty. New messages can be added.
* <p>
* The fragments are used when it is necessary to examine the message
* returned by a server to see if it is saying a directory is empty.
* If an FTP server is returning a different message that still clearly
* indicates a directory is empty, use this property to add a new server
* fragment to the repository via the add method. It would be helpful to
* email support at enterprisedt dot com to inform us of the message so
* it can be added to the next build.
*
* @return messages class
*/
public DirectoryEmptyStrings getDirectoryEmptyMessages() {
return dirEmptyStrings;
}
/**
* Set a new instance of the strings class
*
* @param dirEmptyStrings new instance
*/
public void setDirectoryEmptyMessages(DirectoryEmptyStrings dirEmptyStrings) {
this.dirEmptyStrings = dirEmptyStrings;
}
/* (non-Javadoc)
* @see com.enterprisedt.net.ftp.FTPClientInterface#setDetectTransferMode(boolean)
*/
public void setDetectTransferMode(boolean detectTransferMode) {
this.detectTransferMode = detectTransferMode;
}
/* (non-Javadoc)
* @see com.enterprisedt.net.ftp.FTPClientInterface#getDetectTransferMode()
*/
public boolean getDetectTransferMode() {
return detectTransferMode;
}
/**
* Set to true if the STOU command is always to be used when
* uploading files, even if a filename is supplied. Normally
* STOU is only used if the supplied remote filename is null or
* the empty string.
*
* @param forceUnique true if STOU is always to be used
*/
public void setForceUniqueNames(boolean forceUnique) {
if (forceUnique)
storeCommand = STORE_UNIQ_CMD;
else
storeCommand = STORE_CMD;
}
/**
* Switch the transfer mode if requested and if necessary
*
* @param filename filename of file to be transferred
* @throws FTPException
* @throws IOException
*/
protected void chooseTransferMode(String filename)
throws IOException, FTPException {
if (detectTransferMode) {
if (filename == null) {
log.warn("Cannot choose transfer mode as filename not supplied");
return;
}
if (FileTypes.ASCII.matches(filename) &&
transferType.equals(FTPTransferType.BINARY)) {
setType(FTPTransferType.ASCII);
log.debug("Autodetect on - changed transfer type to ASCII");
}
else if (FileTypes.BINARY.matches(filename) &&
transferType.equals(FTPTransferType.ASCII)) {
setType(FTPTransferType.BINARY);
log.debug("Autodetect on - changed transfer type to binary");
}
}
}
/**
* Set the SO_TIMEOUT in milliseconds on the underlying socket.
* If set this means the socket will block in a read operation
* only for this length of time - useful if the FTP sever has
* hung, for example. The default is 0, which is an infinite timeout.
*
* Note that for JREs 1.4+, the timeout is also used when first
* connecting to the remote host.
*
* @param millis The length of the timeout, in milliseconds
*/
public void setTimeout(int millis)
throws IOException {
this.timeout = millis;
if (control != null)
control.setTimeout(millis);
}
/**
* Get the TCP timeout
*
* @return timeout that is used, in milliseconds
*/
public int getTimeout() {
return timeout;
}
/**
* Returns the control-port being connected to on the remote server.
*
* Note that this method replaces {@link #getControlPort()}.
*
* @return Returns the port being connected to on the remote server.
*/
public int getRemotePort() {
return controlPort;
}
/**
* Set the control to connect to on the remote server. Can only do this if
* not already connected.
*
* Note that this method replaces {@link #setControlPort(int)}.
*
* @param remotePort The port to use.
* @throws FTPException Thrown if the client is already connected to the server.
*/
public void setRemotePort(int remotePort) throws FTPException {
checkConnection(false);
this.controlPort = remotePort;
}
/**
* Returns the control-port being connected to on the remote server.
* @return Returns the port being connected to on the remote server.
* @deprecated Use {@link com.enterprisedt.net.ftp.FTPClientInterface#getRemotePort()} instead.
*/
public int getControlPort() {
return controlPort;
}
/**
* Set the control to connect to on the remote server. Can only do this if
* not already connected.
*
* @param controlPort The port to use.
* @throws FTPException Thrown if the client is already connected to the server.
* @deprecated Use {@link com.enterprisedt.net.ftp.FTPClientInterface#setRemotePort(int)} instead.
*/
public void setControlPort(int controlPort) throws FTPException {
checkConnection(false);
this.controlPort = controlPort;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -