2014-12-18 2 views
2

저는 Android에서 간단한 파일 전송 프로토콜을 구현할 방법을 찾는 초보 프로그래머입니다.Android에서 서버로 "인증"을 사용하는 여러 파일 전송 프로토콜

문제 :

여러 안드로이드 폰이 수신/내장 스토리지에 저장된 XML 파일의 일련을 보내 서버에 연결해야합니다. 서버는 파일을 올바른 폴더에 저장할 수 있도록 연결을 요청하는 전화를 알아야합니다.

가능한 해결 방법/알고리즘 : 서버에 파일을 전송하지만, 그들 중 누구도 "인증"어떤 종류의를 구현하기 위해 보이지 않는다하는 방법에 대한 다양한 튜토리얼/사례가 있습니다

.

이상적으로 나는 다음 (내가 사용하는 것이다 은유)를 구현하고 싶습니다 :

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] 

을 나는 이것이 매우 가능성이 훨씬 더 효율적으로 만들 수있는 실현,하지만 어디서부터 시작 해야할지 모르겠다 ... 서버와의 연결을 시작하고 응답을 기다리는 동안 여러 번 상호 작용할 수 있습니까?

질문 : 어떻게 든 올바른 방향으로 나를 밀어 낼 수 있습니까? 내 자신의 프로토콜을 작성합니까 아니면 표준 기능으로 수행 할 수 있습니까? 이런 종류의 구현을위한 가장 좋은/가장 쉬운 기존 프로토콜은 무엇입니까?

나는 흥미로운 this article을 발견했지만 나는 그것이 인증

어떤 도움이 많이 주시면 감사하겠습니다 여러 파일에 사용 될 수있는 표시되지 않습니다!

답변

2

이전 버전의 FTP를 사용하는 것보다 쉽습니다. 이전 FTP를 사용해 보았습니다.이 FTP는 앱에서 데이터를 수집하는 데 성공 했으므로 서버가 확실히 지원할 것입니다.

  1. enter link description here를 사용하여 각 안드로이드 장치에 대한 고유 ID를 가져옵니다. 각 장치의 처음 부팅시 무작위로 생성되는 64 비트 숫자 (16 진수 문자열)를 얻습니다. 그것은 장치의 수명 동안 일정하게 상수입니다.

  2. 가져 오기 Apache Commons FTP를 가져오고 the method describe here을 사용하여 고유 ID와 일치하는 이름을 사용하여 서버의 작업 디렉토리에 디렉토리 이름을 만듭니다.

  3. 동일한 라이브러리를 사용하여 FTP를 사용하여 파일을 업로드하십시오. 이를 수행하는 방법에 대한 많은 예제를 찾을 수 있습니다. 최소한의 코드 만 필요합니다. 채팅 시나리오는 달리

, 이것은 매우 클라이언트 측 솔루션이며, 전화는 당신이 파일을 업로드 할 수 싶지 않을 수도 - 더 블랙리스트가 없습니다 -하지만 구현하기가 쉽다.

+0

감사합니다. 덕분에 많은 도움이되었습니다. – Hetiwos

1

다양한 FTP 기능을 수행하기 위해 (끔찍한) 코드에 관심이있는 분을 위해 다음과 같습니다. 인터넷에서 찾을 수있는 apache commons ftp jar 파일이 필요합니다.

//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) { 
    } 
} 

나는 누군가가 비슷한 문제를 겪을 수도 있다고 생각합니다.

관련 문제