Android和PC端通过局域网文件同步
本文为大家分享了Android和PC端通过局域网文件同步的具体代码,供大家参考,具体内容如下
publicclassFileOptions{
publicStringname;
publicStringpath;
publiclongsize;
}
//Activity
publicclassMainActivityextendsActivity{
privateTextViewtvMsg;
privateEditTextlogShow,filePath;
privateHandlerhandler;
privateSocketManagersocketManager;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMsg=(TextView)findViewById(R.id.tvMsg);
logShow=(EditText)findViewById(R.id.log_show);
handler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case0:
SimpleDateFormatformat=newSimpleDateFormat("hh:mm:ss");
logShow.append("\n["+format.format(newDate())+"]"+msg.obj.toString());
break;
case1:
tvMsg.setText("请在PC端输入IP:"+GetIpAddress()+"端口:"+msg.obj.toString());
break;
case2:
Toast.makeText(getApplicationContext(),msg.obj.toString(),Toast.LENGTH_SHORT).show();
break;
}
}
};
socketManager=newSocketManager(handler);
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
System.exit(0);
}
publicStringGetIpAddress(){
WifiManagerwifiManager=(WifiManager)getSystemService(WIFI_SERVICE);
WifiInfowifiInfo=wifiManager.getConnectionInfo();
inti=wifiInfo.getIpAddress();
return(i&0xFF)+"."+
((i>>8)&0xFF)+"."+
((i>>16)&0xFF)+"."+
((i>>24)&0xFF);
}
}
//socket管理
publicclassSocketManager{
privatestaticfinalStringFILE_PATH="/glass";
privatestaticfinalStringTAG="SocketManager";
privateServerSocketserver;
privateHandlerhandler=null;
privateListfileList;
publicSocketManager(Handlerhandler){
this.handler=handler;
intport=9999;
while(port>9000){
try{
server=newServerSocket(port);
break;
}catch(Exceptione){
port--;
}
}
SendMessage(1,port);
ThreadreceiveFileThread=newThread(newRunnable(){
@Override
publicvoidrun(){
while(true){//接收文件
ReceiveFile();
}
}
});
receiveFileThread.start();
}
voidSendMessage(intwhat,Objectobj){
if(handler!=null){
Message.obtain(handler,what,obj).sendToTarget();
}
}
//接收文件
voidReceiveFile(){
SocketsocketPC=null;
try{
GetAllFiles();
socketPC=server.accept();
InetAddressnetAddr=socketPC.getInetAddress();
Stringipaddr=netAddr.getHostAddress();
Log.w(TAG,ipaddr);
OutputStreamoutputStream=socketPC.getOutputStream();
JSONArrayjsonArr=newJSONArray();
for(inti=0;ifileName,ArrayListpath,
StringipAddress,intport){
try{
for(inti=0;i();
FilerootPath=newFile(Environment.getExternalStorageDirectory().getPath()+FILE_PATH);
File[]files=rootPath.listFiles();//列出所有文件
for(inti=0;i
PC端用VS2005写的。用了Json格式数据进行数据通信。主要用法为:在同一局域网内,打开PC端和Android端程序,按照Android端提示的IP地址及端口在PC端程序编辑框中正确输入,点击链接,即可将sd卡根目录下的相关文件夹下的文件同步到PC端。
//PC端主要源码
//数据传输线程
DWORDWINAPIRecvThread(LPVOIDlpParameter)
{
SOCKETrecvSocket=(SOCKET)lpParameter;
intret=0,strLen=0;
charrecvBuffer[MAX_LEN],*pRecvAllData;
Json::Readerreader;
Json::ValuejsonArr;
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;
}
intjsonSize=jsonArr.size();
CStringstrItem;
fileList.RemoveAll();
for(intj=0;jm_fileListCtrl.InsertItem(j,strItem.GetBuffer(0));
pFileRecvDlg->m_fileListCtrl.SetItemText(j,0,strItem.GetBuffer(0));
strItem=name.c_str();
fileStrfilest;
filest.name=name;
filest.size=size;
fileList.AddTail(filest);
pFileRecvDlg->m_fileListCtrl.SetItemText(j,1,strItem.GetBuffer(0));
}
free(pRecvAllData);
closesocket(recvSocket);
CRectrect;
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(inti=0;isetFile(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);
}
return0;
}
//连接按钮的响应函数
voidCGlassFileRecvDlg::OnBnClickedButtonConnect()
{
//TODO:在此添加控件通知处理程序代码
if(UpdateData()){
BYTEnField0,nField1,nField2,nField3;
m_IpAddrCtrl.GetAddress(nField0,nField1,nField2,nField3);
WSADATAWs;
SOCKETCientSocket;
intRet=0;
intAddrLen=0;
HANDLEhThread=NULL;
charSendBuffer[MAX_PATH];
//InitWindowsSocket
if(WSAStartup(MAKEWORD(2,2),&Ws)!=0)
{
return;
}
//CreateSocket
CientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(CientSocket==INVALID_SOCKET)
{
MessageBox(_T("socket创建失败"));
return;
}
charstrAddr[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,(structsockaddr*)&ServerAddr,sizeof(ServerAddr));
if(Ret==SOCKET_ERROR){
MessageBox(_T("connect失败"));
return;
}else{
HANDLEhThread=CreateThread(NULL,0,RecvThread,(LPVOID)CientSocket,0,NULL);
if(hThread==NULL){
MessageBox(_T("创建线程失败"));
return;
}
CloseHandle(hThread);
}
}
}
源码下载地址为:android端与PC端文件同步
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。