Multiple files transfer protocol with “authentication” from Android to Server
我是一个新手程序员,正在寻找一种在Android上实现简单文件传输协议的方法。
问题:
一些Android手机需要连接到服务器以接收/发送保存在内部存储器中的一系列XML文件。服务器需要知道哪个电话正在请求连接,以便它可以将文件保存在正确的文件夹中。
可能的解决方法/算法
有关如何将文件发送到服务器的各种教程/示例,但它们似乎都没有实现某种"身份验证"。
理想情况下,我想实现以下(我将使用一个比喻):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Phone: Hello. Server: Hi. Who are you and what do you want? [send/receive] Phone A: I'm phone A and I would like to send files. Server: How many files do you want to send, Phone A? Phone A: 6 files, [+extra data like total size or whatever] Server: Alright, you can begin the transfer. Phone A: Transfers... Server: I've succesfully received 6 files, have a good day. [stores the files in a PhoneA folder] Phone A: Bye! [closes connection] |
我意识到这很可能会变得更有效率,但我不知道从哪里开始......
是否甚至可以启动与服务器的连接并在等待响应时多次交互?
题 :
有人能以某种方式把我推向正确的方向吗?我是编写自己的协议还是可以使用标准功能完成?这种实现的最佳/最简单的现有协议是什么?
我发现这篇文章很有趣但我不知道它如何用于带有身份验证的多个文件
任何帮助将非常感激!
这比使用老式FTP更容易,我已成功用于从应用程序收集数据,您的服务器肯定会支持它。
使用此处输入链接说明为每个Android设备获取唯一ID。您将获得一个64位数字(作为十六进制字符串),它是在每个设备首次启动时随机生成的。据推测,它可以在设备的使用寿命期间保持不变。
导入Apache Commons FTP并使用此处描述的方法在服务器上的工作目录中创建一个名称与唯一ID匹配的目录名称。
使用相同的库使用FTP上载文件。你会发现许多如何做到这一点的例子。它需要非常少的代码。
与您的聊天场景不同,这是一个非常客户端的解决方案,您可能不希望上传文件的电话 - 没有黑名单 - 但它很容易实现。
对于那些对(可怕的)代码感兴趣以执行各种FTP功能的人来说,这对我有用。
它需要apache commons ftp jar文件,可以在互联网上找到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | //Button that starts it all public void updateWorkordersList(View view) { if (!CheckNetworkConnection.isOnline()) { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); String connectionString = prefs .getString("connection_string", null); String userName = prefs.getString("FTPusername", null); DownloadFilesTask task = new DownloadFilesTask(connectionString, userName); task.execute(); Fragment frg = null; frg = getFragmentManager() .findFragmentByTag("buttonsContainer"); final FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.detach(frg); ft.attach(frg); ft.commit(); } } private class DownloadFilesTask extends AsyncTask<Void, Void, Boolean> { private FTPClient mFtpClient = new FTPClient(); private FTPFile[] mFileArray; private String _address; private String _user; private String _pass; public DownloadFilesTask(String ip, String user) { _address = ip; _user = user; } @Override protected Boolean doInBackground(Void... params) { try { mFtpClient.setConnectTimeout(10 * 1000); mFtpClient.connect(InetAddress.getByName("insert server here")); boolean status = mFtpClient.login("username","password"); if (FTPReply.isPositiveCompletion(mFtpClient.getReplyCode())) { mFtpClient.setFileType(FTP.ASCII_FILE_TYPE); mFtpClient.enterLocalPassiveMode(); mFileArray = mFtpClient.listFiles(); } } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //Download All Files if (FTPReply.isPositiveCompletion(mFtpClient.getReplyCode())) { File directory = null; directory = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS).getPath()); for (FTPFile file : mFileArray) { OutputStream outputStream = null; try { outputStream = new BufferedOutputStream( new FileOutputStream(directory +"/" + file.getName())); mFtpClient.setFileType(FTP.BINARY_FILE_TYPE); mFtpClient.retrieveFile(file.getName(), outputStream); } catch (Exception ex) { ex.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } //Upload All Files if (FTPReply.isPositiveCompletion(mFtpClient.getReplyCode())) { File directory = null; directory = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS).getPath() +"/srvReady"); for (File file : directory.listFiles()) { try { FileInputStream srcFileStream = new FileInputStream(directory +"/" + file.getName()); boolean status = mFtpClient.storeFile(_user +"/" + file.getName(), srcFileStream); srcFileStream.close(); if (status){ file.delete(); } } catch (Exception e) { e.printStackTrace(); } } } try { mFtpClient.logout(); mFtpClient.disconnect(); } catch (Exception e) { // TODO: handle exception } return true; } protected void onProgressUpdate(Integer... progress) { } protected void onPostExecute(Boolean result) { } } |
我认为这可能是有用的,可能有人遇到过类似的问题。