中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中怎么通過局域網文件同步

發布時間:2021-06-28 18:19:03 來源:億速云 閱讀:270 作者:Leah 欄目:移動開發

這篇文章將為大家詳細講解有關Android中怎么通過局域網文件同步,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

具體內容如下

public class FileOptions {
   public String name;
   public String path;
   public long size;
}
 
//Activity
public class MainActivity extends Activity {
   private TextView tvMsg;
   private EditText logShow, filePath;
   private Handler handler;
   private SocketManager socketManager;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout. activity_main);
      
      tvMsg = (TextView)findViewById(R.id. tvMsg);
      logShow = (EditText)findViewById(R.id. log_show);
      handler = new Handler(){
         @Override
         public void handleMessage(Message msg) {
           switch(msg. what){
           case 0:
              SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss" );
              logShow.append( "\n[" + format.format(new Date()) + "]" + msg.obj .toString());
              break;
           case 1:
              tvMsg.setText( "請在PC端輸入IP:" + GetIpAddress() + " 端口:" + msg.obj .toString());
              break;
           case 2:
             Toast. makeText(getApplicationContext(), msg.obj.toString(), Toast. LENGTH_SHORT).show();
              break;
           }
        }
      };
      socketManager = new SocketManager( handler);
   }
   @Override
   protected void onDestroy() {
      super.onDestroy();
      System. exit(0);
   }
   public String GetIpAddress() {  
     WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE );  
     WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
     int i = wifiInfo.getIpAddress();
     return (i & 0xFF) + "." +  
       ((i >> 8 ) & 0xFF) + "." +  
       ((i >> 16 ) & 0xFF)+ "." +  
        ((i >> 24 ) & 0xFF );  
   }  
}
 
//socket管理
public class SocketManager {
   private static final String FILE_PATH= "/glass";
   private static final String TAG = "SocketManager";
   private ServerSocket server;
   private Handler handler = null;
   private List<FileOptions> fileList;
 
   public SocketManager(Handler handler) {
      this. handler = handler;
      int port = 9999;
      while (port > 9000) {
         try {
           server = new ServerSocket(port);
           break;
        } catch (Exception e) {
           port--;
        }
      }
      SendMessage(1, port);
      Thread receiveFileThread = new Thread( new Runnable() {
         @Override
         public void run() {
           while ( true) { // 接收文件
              ReceiveFile();
           }
        }
      });
      receiveFileThread.start();
   }
 
   void SendMessage( int what, Object obj) {
      if ( handler != null) {
        Message. obtain( handler, what, obj).sendToTarget();
      }
   }
 
   // 接收文件
   void ReceiveFile() {
      Socket socketPC= null;
      try {
        GetAllFiles();
        socketPC = server.accept();
        InetAddress netAddr = socketPC.getInetAddress();
        String ipaddr = netAddr.getHostAddress();
        Log. w( TAG, ipaddr);
        OutputStream outputStream = socketPC.getOutputStream();
        JSONArray jsonArr= new JSONArray();
         for( int i=0;i< fileList.size();i++){
           try {
              JSONObject jsonObj= new JSONObject();
              jsonObj.put( "name", fileList.get(i). name);
              jsonObj.put( "path", fileList.get(i). path);
              jsonObj.put( "size", fileList.get(i). size);
              jsonArr.put(jsonObj);
           } catch (JSONException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
        }
        
        String sendStr=jsonArr.toString();
         byte[] sendBuf=sendStr.getBytes( "GB2312");
        outputStream.write(sendBuf, 0, sendBuf. length);
        outputStream.flush();
        SendMessage(0, " 發送文件索引完成" );
        outputStream.close();
        socketPC.close();
        
         for( int i=0;i< fileList.size();i++){
           Socket fileSendSocket = server.accept();
           File fsend= new File( fileList.get(i). path);
           FileInputStream fis= new FileInputStream(fsend);
           OutputStream fos = fileSendSocket.getOutputStream();
           byte[] buf = new byte[1024];
           while ( true) { 
           int read = 0; 
           if (fis != null) { 
             read = fis.read(buf); 
           } 
           if (read == -1) { 
             break; 
           } 
           fos.write(buf,0,read); 
         }
           fos.flush();
           SendMessage(0, fileList.get(i). name+ "--文件傳輸完成" );
           fis.close();
           fos.close();
           fileSendSocket.close();
        }
        
      } catch (IOException e) {
         // TODO Auto-generated catch block
        e.printStackTrace();
      }
   }
 
   public void SendFile(ArrayList<String> fileName, ArrayList<String> path,
        String ipAddress, int port) {
      try {
         for ( int i = 0; i < fileName.size(); i++) {
           Socket name = new Socket(ipAddress, port);
           OutputStream outputName = name.getOutputStream();
           OutputStreamWriter outputWriter = new OutputStreamWriter(
                outputName);
           BufferedWriter bwName = new BufferedWriter(outputWriter);
           bwName.write(fileName.get(i));
           bwName.close();
           outputWriter.close();
           outputName.close();
           name.close();
           SendMessage(0, "正在發送" + fileName.get(i));
 
           Socket data = new Socket(ipAddress, port);
           OutputStream outputData = data.getOutputStream();
           FileInputStream fileInput = new FileInputStream(path.get(i));
           int size = -1;
           byte[] buffer = new byte[1024];
           while ((size = fileInput.read(buffer, 0, 1024)) != -1) {
              outputData.write(buffer, 0, size);
           }
           outputData.close();
           fileInput.close();
           data.close();
           SendMessage(0, fileName.get(i) + " 發送完成" );
        }
        SendMessage(0, "所有文件發送完成" );
      } catch (Exception e) {
        SendMessage(0, "發送錯誤:\n" + e.getMessage());
      }
   }
   //待優化
   private void GetAllFiles(){
      fileList= new ArrayList<FileOptions>();
      File rootPath= new File(Environment.getExternalStorageDirectory().getPath()+ FILE_PATH);
      File[] files = rootPath.listFiles(); // 列出所有文件
      for( int i=0;i<files. length;i++){
         if(files[i].isFile()){
           FileOptions fp= new FileOptions();
           fp. name=files[i].getName();
           fp. path=files[i].getPath();
           fp. size=files[i].length();
           fileList.add(fp);
        }
      }
   }
}

PC端用VS2005寫的。用了Json格式數據進行數據通信。主要用法為:在同一局域網內,打開PC端和Android端程序,按照Android端提示的IP地址及端口在PC端程序編輯框中正確輸入,點擊鏈接,即可將sd卡根目錄下的相關文件夾下的文件同步到PC端。

//PC端主要源碼
//數據傳輸線程
DWORD WINAPI RecvThread(LPVOID lpParameter)
{
   SOCKET recvSocket = (SOCKET)lpParameter;
    int ret = 0,strLen=0;
    char recvBuffer[MAX_LEN],*pRecvAllData;
   Json::Reader reader;
   Json::Value jsonArr;
   
    while ( true )
   {
       /*
      
      */
      pRecvAllData=( char *)malloc(MAX_LEN);
       while ((ret = recv(recvSocket, recvBuffer, MAX_LEN, 0))>0){
         strLen+=ret;
         pRecvAllData=( char *)realloc(pRecvAllData,strLen);
         memcpy(pRecvAllData+strLen-ret,recvBuffer,ret);
      };
      
       if (!reader.parse(pRecvAllData, jsonArr)){
         Sleep(1000);
          continue ;
      }
       int jsonSize = jsonArr.size();
      CString strItem;
      fileList.RemoveAll();
       for (int j = 0; j < jsonSize; ++j) 
      { 
         std::string name = jsonArr[j][ "name" ].asString();
         std::string path = jsonArr[j][ "path" ].asString();
          int size = jsonArr[j][ "size" ].asInt();
         strItem.Format(TEXT( "%d" ), j+1);
         pFileRecvDlg->m_fileListCtrl.InsertItem(j,strItem.GetBuffer(0));
         pFileRecvDlg->m_fileListCtrl.SetItemText(j,0,strItem.GetBuffer(0));
         strItem=name.c_str();
         fileStr filest;
         filest.name=name;
         filest.size=size;
         fileList.AddTail(filest);
         pFileRecvDlg->m_fileListCtrl.SetItemText(j,1,strItem.GetBuffer(0));
      }
      free(pRecvAllData);
      closesocket(recvSocket);
 
      CRect rect;
      pFileRecvDlg->GetClientRect(&rect);
      pFileRecvDlg->ClientToScreen(rect);
       if (!pProgressDlg->IsWindowVisible()){
         pProgressDlg->ShowWindow(SW_SHOW);
      }
      pProgressDlg->SetWindowPos(NULL,rect.left+100,rect.top+100,0,0,SWP_NOSIZE);
      pFileRecvDlg->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);
       // 發送文件名
       for (int i=0;i<jsonSize;i++){
         SOCKET nameSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
          int ret = connect(nameSocket,( struct sockaddr*)&ServerAddr, sizeof (ServerAddr));
          if ( ret == SOCKET_ERROR ){
            AfxMessageBox(_T( "connect 失敗 "));
         } else {
         }
         FILE *fp;
          int tempCount=0;
         fileStr flst=fileList.GetAt(fileList.FindIndex(i));
         fopen_s(&fp,flst.name.c_str(), "wb+" );
         
         pProgressDlg->setFile(flst.name,flst.size);
          while ((ret = recv(nameSocket, recvBuffer, MAX_LEN, 0))!=0){
            fwrite(recvBuffer, sizeof (char ),ret,fp);
            tempCount+=ret;
            pProgressDlg->updateProgress(tempCount);
         }
         _fcloseall( );
         closesocket(nameSocket);
      }
      pFileRecvDlg->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);
      pProgressDlg->ShowWindow(SW_HIDE);
   }
    return 0;
}
//連接按鈕的響應函數
void CGlassFileRecvDlg::OnBnClickedButtonConnect()
{
    // TODO: 在此添加控件通知處理程序代碼
    if (UpdateData()){
      BYTE nField0,nField1,nField2,nField3;
      m_IpAddrCtrl.GetAddress(nField0,nField1,nField2,nField3);
      WSADATA Ws;
      SOCKET CientSocket;
       int Ret = 0;
       int AddrLen = 0;
      HANDLE hThread = NULL;
       char SendBuffer[MAX_PATH];
 
       //Init Windows Socket
       if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
      {
          return ;
      }
       //Create Socket
      CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       if ( CientSocket == INVALID_SOCKET )
      {
         MessageBox(_T( "socket 創建失敗 " ));
          return ;
      }
 
       char strAddr[50],tempStr[10];
      memset(strAddr,0, sizeof (strAddr));
      memset(tempStr,0, sizeof (tempStr));
      itoa(nField0,tempStr,10);
      strcat(strAddr,tempStr);
      strcat(strAddr, "." );
      itoa(nField1,tempStr,10);
      strcat(strAddr,tempStr);
      strcat(strAddr, "." );
      itoa(nField2,tempStr,10);
      strcat(strAddr,tempStr);
      strcat(strAddr, "." );
      itoa(nField3,tempStr,10);
      strcat(strAddr,tempStr);
 
      ServerAddr.sin_family = AF_INET;
      ServerAddr.sin_addr.s_addr = inet_addr(strAddr);
      ServerAddr.sin_port = htons(m_port);
      memset(ServerAddr.sin_zero, 0x00, 8);
 
      Ret = connect(CientSocket,( struct sockaddr*)&ServerAddr, sizeof (ServerAddr));
       if ( Ret == SOCKET_ERROR ){
         MessageBox(_T( "connect 失敗 "));
          return ;
      } else {
         HANDLE hThread = CreateThread(NULL, 0, RecvThread, (LPVOID)CientSocket, 0, NULL);
          if ( hThread == NULL ){
            MessageBox(_T( " 創建線程失敗 "));
             return ;
         }
         CloseHandle(hThread);
      }
   }
}

關于Android中怎么通過局域網文件同步就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梁河县| 偏关县| 弥勒县| 集安市| 宁津县| 崇信县| 枝江市| 仙游县| 临朐县| 得荣县| 崇义县| 白城市| 皋兰县| 额济纳旗| 静海县| 潢川县| 通州区| 汕尾市| 台南县| 丹阳市| 惠东县| 浏阳市| 浪卡子县| 全南县| 中山市| 阿合奇县| 根河市| 吕梁市| 正镶白旗| 射阳县| 沭阳县| 苏尼特左旗| 宁化县| 阿城市| 同德县| 苗栗市| 永州市| 北安市| 两当县| 商水县| 彭水|