Android和PC端通过局域网文件同步

本文为大家分享了Android和PC端通过局域网文件同步的具体代码,供大家参考,具体内容如下

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端与PC端文件同步

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Java回顾之多线程同步的使用详解

    首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索. 为什么要线程同步? 说到线程同步,大部分情况下, 我们是在针对"单对象多线程"的情况进行讨论,一般会将其分成两部分,一部分是关于"共享变量",一部分关于"执行步骤". 共享变量 当我们在线程对象(Run

  • Android使用OkHttp进行网络同步异步操作

    OkHttp是一个Java和Android的HTTP和HTTP/2的客户端,负责发送HTTP请求以及接受HTTP响应. 一.使用OkHttp OkHttp发送请求后,可以通过同步或异步地方式获取响应.下面就同步和异步两种方式进行介绍. 1.1.同步方式 发送请求后,就会进入阻塞状态,知道收到响应.下面看一个下载百度首页的例子: OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).bui

  • 解析Java线程同步锁的选择方法

    在需要线程同步的时候如何选择合适的线程锁?例:选择可以存入到常量池当中的对象,String对象等 复制代码 代码如下: public class SyncTest{    private String name = "name";public void method(String flag)    {        synchronized (name)        {            System.out.println(flag + ", invoke metho

  • Android和PC端通过局域网文件同步

    本文为大家分享了Android和PC端通过局域网文件同步的具体代码,供大家参考,具体内容如下 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;

  • 判断iOS、Android以及PC端的示例代码

    前言 我们在做移动端时,在跨平台.浏览器.移动设备兼容的时候,要根据设备.浏览器做特定调整,想起用navigator.userAgent来对浏览器类型进行判断,查了点资料,在这里总结下 还有一个就是移动端的缩放问题,在meta标签中进行设置,对部分浏览器进行强制性的限制 1.navigator的一些常用属性 navigator为window对象的一个属性,指向了一个包含浏览器相关信息的对象 navigator.appVersion 浏览器的版本号 navigator.language 浏览器使用

  • 树莓派与PC端在局域网内运用python实现即时通讯

    电脑和树莓派在同一局域网内,先在电脑和树莓派创建python运行环境,然后在树莓派中用python运行rpi.py:在电脑上运行computer.py:电脑上输入字符即可在树莓派上即时显示! rpi.py #coding:utf-8 #import necessary package import socket import time import sys HOST_IP = "192.168.31.151" #树莓派的IP地址 HOST_PORT = 8888 print("

  • javascript html5移动端轻松实现文件上传

    PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现. 用的技术主要是: ajax FileReader FormData HTML结构: <div class="camera-area"> <form enctype="multipart/form-data" method="post">

  • Thinkphp通过一个入口文件如何区分移动端和PC端

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <?php // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',True); define('MULTI_MODULE', false); // 获取当前文件所在的目录 define('DKSITE_TSDIR

  • Android PC端用ADB抓取指定应用日志实现步骤

    主要功能: 用于在PC端通过ADB工具抓取指定android真机上运行的指定包名应用的调试日志,并生成本地txt文件. 实现步骤: 1.准备ADB调试软件: 2.根据包名找到进程pid; 新建一个txt文件,重命名为"getpid.bat",把下面代码复制到该文档中,保存: 包名"com.wtoe.demo"可替换为自己所需要抓取日志的包名. @echo off adb shell "ps | grep com.wtoe.demo" 3.根据包名

  • android手机端与PC端使用adb forword通信

    PC端与Android手机端使用adb forword通信 服务器端代码如下: import java.io.IOException; import java.io.ObjectOutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Server { public static final String TAG = "ser

  • Android端内数据状态同步方案VM-Mapping详解

    目录 背景 问题拆解 目标 方案调研 EventBus 基于k-v的监听.通知 全局共享数据Model实例 基于注解的对象映射方案VM-Mapping 特点 思考 突破View层级的限制 突破类型的限制 详细设计 映射 数据驱动UI 总体流程 其它细节 方案对比 方案收益 后续计划 背景 西瓜在feed.详情页.个人主页有一块功能区,包括了点赞.收藏.关注等功能.这些功能长久以来都是孤立的:多个场景下点赞.收藏.关注等状态或数量不一致.在以往的业务迭代中,都是业务A有了需求,就加个点赞的请求,把

  • android蓝牙控制PC端代码分享

    引言 在安卓端通过蓝牙发送指令到PC端,java程序接收指令,并执行相应的动作.其中指令格式有所规范,PC端的java程序通过robot库进行操作 代码 控制类remotePC.java import java.awt.AWTException; import java.awt.Dimension; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.awt.e

  • 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换

    我比较喜欢听音乐,特别是周末的时候,电脑开着百度随心听fm,随机播放歌曲,躺在床上享受.但碰到了一个烦人的事情,想切掉不喜欢的曲子,还得起床去操作电脑换歌.于是思考能不能用手机控制电脑切换歌曲,经过一段事件的思考,绝对采用html5+socket.io来实现这个功能.首先我把该功能的实现拆分为以下几个步骤: 1.移动端前端页面+脚本逻辑实现 2.PC端前端页面+脚本逻辑实现 3.后台逻辑实现 4.加入socket.io实现长连接 5.实现移动端控制PC端逻辑 1.移动端页面脚本的实现 html页

随机推荐