问题描述
我试图通过我的android应用程序连接到在Windows机器上运行的FTP。我不确定出什么问题了,因为相同的代码可以在常规的Java项目中工作。
我的清单具有权限
<uses-permission android:name="android.permission.INTERNET"/>
一个片段运行连接代码。我已经尝试过apache和edtftpj,并且都有相同的问题。
Edtftpj
import com.enterprisedt.net.ftp.FTPConnectMode;
import com.enterprisedt.net.ftp.FTPException;
import com.enterprisedt.net.ftp.FileTransferClient;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
public class SecondFragment extends Fragment
{
private Activity mainActivity;
private EditText serverIPView,serverPortView;
private EditText serverUsernameView,serverPasswordView;
private Thread ftpThread = new Thread(new Runnable() {
@Override
public void run()
{
String serverHost = serverIPView.getText().toString();
String serverPort = serverPortView.getText().toString();
String username =serverUsernameView.getText().toString();
String password = serverPasswordView.getText().toString();
try {
FileTransferClient client = new FileTransferClient();
client.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.PASV);
client.setRemoteHost("192.168.1.50");
client.setRemotePort(21);
client.setUserName(username);
client.setPassword(password);
Random rand = new Random();
byte[] bytes = new byte[1000];
rand.nextBytes(bytes);
client.connect();
OutputStream out = client.uploadStream("temp");
long begin = System.nanoTime();
out.write(bytes);
long end = System.nanoTime();
out.close();
client.deleteFile("temp");
client.disconnect();
double time = (double)(end - begin) / 1000000000;
Log.i("RunFTP",String.valueOf(time) + " seconds");
} catch (IOException | FTPException e) {
e.printStackTrace();
}
}
});
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_second,container,false);
}
public void onViewCreated(@NonNull View view,Bundle savedInstanceState) {
super.onViewCreated(view,savedInstanceState);
mainActivity = getActivity();
// get user text view of inputted server IP and port
serverIPView = view.findViewById(R.id.ftpSelectedIP);
serverPortView = view.findViewById(R.id.ftpSelectedPort);
// get user text views of inputted server credentials
serverUsernameView = view.findViewById(R.id.ftpSelectedUsername);
serverPasswordView = view.findViewById(R.id.ftpSelectedPassword);
Button runButton = view.findViewById(R.id.ftpRunButton);
runButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ftpThread.start();
try {
ftpThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
Apache Commons:
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
public class SecondFragment extends Fragment
{
private Activity mainActivity;
private EditText serverIPView,serverPasswordView;
private Thread ftpThread = new Thread(new Runnable() {
@Override
public void run()
{
String username =serverUsernameView.getText().toString();
String password = serverPasswordView.getText().toString();
FTPClient ftp = new FTPClient();
try {
ftp.connect("192.168.1.50",21);
ftp.login(username,password);
System.out.print(ftp.getReplyString());
int reply = ftp.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.err.println("FTP server refused connection.");
System.exit(1);
}
Random rand = new Random();
byte[] bytes = new byte[1000];
rand.nextBytes(bytes);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE);
ftp.enterLocalPassiveMode();
OutputStream out = ftp.storeFileStream("temp");
long begin = System.nanoTime();
out.write(bytes);
long end = System.nanoTime();
ftp.deleteFile("temp");
ftp.logout();
double time = (double)(end - begin) / 1000000000;
Log.i("RunFTP",String.valueOf(time) + " seconds");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
});
@Override
public View onCreateView(LayoutInflater inflater,savedInstanceState);
mainActivity = getActivity();
// get user text view of inputted server IP and port
serverIPView = view.findViewById(R.id.ftpSelectedIP);
serverPortView = view.findViewById(R.id.ftpSelectedPort);
// get user text views of inputted server credentials
serverUsernameView = view.findViewById(R.id.ftpSelectedUsername);
serverPasswordView = view.findViewById(R.id.ftpSelectedPassword);
Button runButton = view.findViewById(R.id.ftpRunButton);
runButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ftpThread.start();
try {
ftpThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
错误:
W/System.err: java.net.SocketTimeoutException: failed to connect to /192.168.1.50 (port 21) from /100.96.240.94 (port 34106) after 60000ms
W/System.err: at libcore.io.IoBridge.connectErrno(IoBridge.java:191)
at libcore.io.IoBridge.connect(IoBridge.java:135)
W/System.err: at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
W/System.err: at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at com.enterprisedt.util.proxy.PlainSocket.createPlainSocket(PlainSocket.java:131)
at com.enterprisedt.net.ftp.FTPControlSocket.<init>(FTPControlSocket.java:415)
at com.enterprisedt.net.ftp.FTPClient.connect(FTPClient.java:1056)
W/System.err: at com.enterprisedt.net.ftp.FileTransferClient.connect(FileTransferClient.java:424)
at com.example.networkscanner.SecondFragment$1.run(SecondFragment.java:58)
at java.lang.Thread.run(Thread.java:919)
我的Windows FTP服务器。一切设置完毕,端口转发设置完毕,尝试将其连接到同一网络并在移动设备上进行。
有什么想法吗?我不确定该怎么办。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)