局域网内pc传文件到android,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 ListfileList;

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(ArrayListfileName, ArrayListpath,

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

//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;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);

}

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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值