學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 網(wǎng)絡(luò)知識 > 網(wǎng)絡(luò)基礎(chǔ)知識 >

Android和PC端通過局域網(wǎng)文件同步用代碼怎么實(shí)現(xiàn)

時(shí)間: 加城1195 分享

  局域網(wǎng)通常是分布在一個(gè)有限地理范圍內(nèi)的網(wǎng)絡(luò)系統(tǒng),一般所涉及的地理范圍只有幾公里。局域網(wǎng)專用性非常強(qiáng),具有比較穩(wěn)定和規(guī)范的拓?fù)浣Y(jié)構(gòu)。這篇文章主要為大家詳細(xì)介紹了Android和PC端通過局域網(wǎng)文件同步的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

  具體實(shí)現(xiàn)代碼如下

  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( "請?jiān)赑C端輸入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, " 發(fā)送文件索引完成" );

  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, "正在發(fā)送" + 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) + " 發(fā)送完成" );

  }

  SendMessage(0, "所有文件發(fā)送完成" );

  } catch (Exception e) {

  SendMessage(0, "發(fā)送錯(cuò)誤:\n" + e.getMessage());

  }

  }

  //待優(yōu)化

  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格式數(shù)據(jù)進(jìn)行數(shù)據(jù)通信。主要用法為:在同一局域網(wǎng)內(nèi),打開PC端和Android端程序,按照Android端提示的IP地址及端口在PC端程序編輯框中正確輸入,點(diǎn)擊鏈接,即可將sd卡根目錄下的相關(guān)文件夾下的文件同步到PC端。

  //PC端主要源碼

  //數(shù)據(jù)傳輸線程

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

  // 發(fā)送文件名

  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;

  }

  //連接按鈕的響應(yīng)函數(shù)

  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 創(chuàng)建失敗 " ));

  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( " 創(chuàng)建線程失敗 "));

  return ;

  }

  CloseHandle(hThread);

  }

  }

  }

  補(bǔ)充:局域網(wǎng)、校園網(wǎng)安全維護(hù)方法

  校園網(wǎng)絡(luò)分為內(nèi)網(wǎng)和外網(wǎng),就是說他們可以上學(xué)校的內(nèi)網(wǎng)也可以同時(shí)上互聯(lián)網(wǎng),大學(xué)的學(xué)生平時(shí)要玩游戲購物,學(xué)校本身有自己的服務(wù)器需要維護(hù);

  在大環(huán)境下,首先在校園網(wǎng)之間及其互聯(lián)網(wǎng)接入處,需要設(shè)置防火墻設(shè)備,防止外部攻擊,并且要經(jīng)常更新抵御外來攻擊;

  由于要保護(hù)校園網(wǎng)所有用戶的安全,我們要安全加固,除了防火墻還要增加如ips,ids等防病毒入侵檢測設(shè)備對外部數(shù)據(jù)進(jìn)行分析檢測,確保校園網(wǎng)的安全;

  外面做好防護(hù)措施,內(nèi)部同樣要做好防護(hù)措施,因?yàn)橛械膶W(xué)生電腦可能帶回家或者在外面感染,所以內(nèi)部核心交換機(jī)上要設(shè)置vlan隔離,旁掛安全設(shè)備對端口進(jìn)行檢測防護(hù);

  內(nèi)網(wǎng)可能有ddos攻擊或者arp病毒等傳播,所以我們要對服務(wù)器或者電腦安裝殺毒軟件,特別是學(xué)校服務(wù)器系統(tǒng)等,安全正版安全軟件,保護(hù)重要電腦的安全;

  對服務(wù)器本身我們要安全server版系統(tǒng),經(jīng)常修復(fù)漏洞及更新安全軟件,普通電腦一般都是撥號上網(wǎng),如果有異常上層設(shè)備監(jiān)測一般不影響其他電腦。做好安全防范措施,未雨綢繆。


Android和PC端通過局域網(wǎng)文件同步用代碼怎么實(shí)現(xiàn)相關(guān)文章:

1.同一無線局域網(wǎng)怎么用安卓設(shè)備訪問pc共享文件

2.沒有網(wǎng)怎么用局域網(wǎng)進(jìn)行手機(jī)電腦文件傳輸

3.安卓手機(jī)怎么樣共享電腦局域網(wǎng)文件

4.安卓系統(tǒng)在局域網(wǎng)下如何訪問pc共享文件

5.android局域網(wǎng)怎么傳文件

4051392