本文为大家分享了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 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 fileName, ArrayList 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();

File rootPath= new File(Environment.getExternalStorageDirectory().getPath()+ FILE_PATH);

File[] files = rootPath.listFiles(); // 列出所有文件

for( int i=0;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

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 自动备份到局域网,Android和PC端通过局域网文件同步相关推荐

  1. 自动备份android,Android自动备份错误

    我正在尝试实现android自动备份(Android 6.0),但是它不起作用. 我得到了同样的错误 10-28 22:58:06.980 600-5578/? I/PFTBT: Initiating ...

  2. ESP32E基于Thonny——python框架,PC端进行局域网控制led亮灭

    ESP32基于Thonny--python框架,PC端进行局域网控制led亮灭 用中文讲,该如何实现这个功能呢? 1:成功连接wifi 2:能循环正常接收数据 3:判断接收的数据,使led亮灭 就3步 ...

  3. android 短信自动备份软件,从Android设备备份短信的5大工具

    您是否正在寻找2020中最好的数据传输工具? 然后再看看. 我们将向您展示最佳数据传输工具列表 备份短信 在Android上 您可以使用以下方法安全地保存您的个人文件. 部分1. 如何使用共享备份文本 ...

  4. android 自动挂断,[转]android 来电自动接听和自动挂断

    注意:android2.3版本不支持下面的自动接听方法.(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current proces ...

  5. android : 小米手机 打开开发者 选项 PC 端 安装 apk

    红米手机 打开 开发者选项: 设置 –> 我的设备–> 全部参数 –> MIUI版本 连续 点击 5下 在全部参数界面,我们找到MIUI版本这一条,然后点击这一条5次,点击的时候,屏 ...

  6. android 自动读取短息,Android实现短信验证码自动拦截读取功能

    本文实例为大家分享了Android短信验证码自动拦截读取 的具体代码,供大家参考,具体内容如下 知识准备: 1.观察者模式的理解[文章稍后来到~~] 2.Android的Cursor使用[Androi ...

  7. android 自动下一首,Android播播放完SD卡指定文件夹音乐之后,自动播放下一首

    最近做一个项目,需要连续播放音乐,播放完一首歌之后,自动播放完下一首歌.不要重复播放. 代码如下: package com.example.asyncplayer_ex; import java.io ...

  8. android开启前台服务_如何在PC端一次性开启Tasker的所有权限和服务

    Tasker需要开启很多服务和获取很多权限 通过下面的命令可以详细获取Tasker相关的权限和服务 adb shell dumpsys package net.dinglisch.android.ta ...

  9. android自动登录简书,Android开发之简单登录界面

    用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...

最新文章

  1. 继承:深度优先和广度优先
  2. MySQL5.6开启慢查询
  3. 区块链在天猫国际商品溯源中的应用
  4. VF01 BAPI :BAPI_BILLINGDOC_CREATEMULTIPLE
  5. htmlspecialchars() 函数过滤XSS的问题
  6. Golang笔记——go使用Redis
  7. C/C++中的联合 union
  8. 《Android框架揭秘》——2.5节应用程序Framework源码级别调试
  9. 亿图图示-----思维导图MindMaster示例
  10. 十分钟了结MySQL information_schema
  11. android 卡片行星,卡片详情
  12. 睁开双眼玩立体游戏!3D显示技术解析
  13. Visual Prompt Tuning (VPT)
  14. 2019 ICPC 上海网络赛 K. Peekaboo
  15. 快速解决Kubernetes从k8s.gcr.io仓库拉取镜像失败问题
  16. 机械手臂c语言如何编程,工业机械手臂程序示教图文教程
  17. 串级PID的一些理解
  18. Science:前额叶皮层在哺乳动物上的解剖学异同
  19. 企业经营(数据)分析
  20. 使用Sawyer机器人实现抓取任务(前期准备)

热门文章

  1. 餐饮用品批发拓客的10个经典方法
  2. 瓜子二手车html模板,以瓜子二手车为例,UI设计从C端到B端
  3. fatal error C1083: 无法打开包括文件:“pcap.h”: WinPcap编程
  4. 外贸网站最简单的添加社交分享的代码-Share Buttons Code for Any Website - AddToAny
  5. CTF-web Xman-2018 第一天 入营msic
  6. c语言基础知识点总结ppt,《C语言基础知识》PPT课件.ppt
  7. django使用redis
  8. 矩阵特征值分解与奇异值分解含义解析及应用
  9. 写作中的英文标点符号
  10. 碧桂园博智林机器人总部大楼_碧桂园的800亿机器人梦,碎了?