android 自动备份到局域网,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 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);

}

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 1.5.1 beta 大小:6.3MB 更新:2014-12-24 Android 4.0.4 自同步是一款由国内创业团队推出的局域网P2P免费文件同步工具。处在同一个局域网下的多台电脑,可通过自同步来建立电脑里文件夹之间的同步关系,做到文件夹中文件的数量、内容相一致,并且不需要云和外网。此外,自同步特有的密钥加密更保证了数据的安全性。并且,其特有的分享功能又可以做到轻轻松松将同步目录分享给周围的朋友们。 软件特点 1. 无需网盘,局域同步 与市面上流行的网盘不同,自同步不需要您的设备时时刻刻连接互联网完成文件同步工作,而只需要在同一个局域网内就能完成文件同步工作。 2. 实时同步,多台互联 处于同步中的目录,只要其中一个目录发生变化,如文件/目录添加、修改、删除等操作,那么与该目录建立同步关系的其它目录也会迅速反应,进行相应的修改,保持与原目录的文件一致;此外,只需将文件放到同步目录,程序将自动上传这些文件,同时其它电脑登陆自同步自动下载到新电脑,实现多台电脑的文件同步。 3. 目录分享,轻松同步 同步目录分享功能,可以轻松将同步目录分享给周围的朋友(无需同步口令相同)。 4. 密钥加密,保护数据 在局域网内采用AES加密方式传输数据并建立密钥,防止处于同一局域网内的非法设备窃取数据。 5. 优化传输,极速速度 千兆路由的局域网环境下传输速度最高可达70MB/s,同步过程犹如硬盘间的复制粘贴一样方便快捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值