Android Wi-Fi直连 传输数据

一旦两个设备之间建立了Wi-Fi直连,那么这两个设备之间就可以通过socket传输数据大概得步骤如下:
* 通过ServerSocket创建一个server端,在后台一直坚挺是否有client端连接
* 通过Socket建立一个client端,根据server端的ip和port,连接到server端
* 建立连接之后,通过client向server端发送数据
* server端接到数据之后,可以对数据做对应的处理

Client端的核心逻辑

  • 在服务中创建一个client,并发送数据

      public class FileTransferService extends IntentService{  ...  @Override  protected void onHandleIntent(Intent intent) {      Context context = getApplicationContext();      if(intent.getAction().equals(ACTION_SEND_FILE)){          String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);          String host = intent.getExtras().getString(EXTRAS_GROUP_ADDRESS);          Socket socket = new Socket();          int port = intent.getExtras().getInt(EXTRAS_GROUP_PORT);          try{              socket.bind(null);              //根据server端的地址和端口建立socket,并设置超时              socket.connect(new InetSocketAddress(host, port),SOCKET_TIMEOUT);              OutputStream os = socket.getOutputStream();              ContentResolver cr = context.getContentResolver();              InputStream is = null;              is = cr.openInputStream(Uri.parse(fileUri));              //发送数据              DeviceDetailFragment.copyFile(is, os);          }catch(Exception ex){          }finally{              if(socket != null){                  if(socket.isConnected()){                      try {                          socket.close();                      } catch (IOException e) {                          e.printStackTrace();                      }                    }                }            }        }    }  }
  • 需要从相册中选择图片,并启动service

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);        intent.setType("image/*");        startActivityForResult(intent, CHOOSE_FILE_RESULT_CODE);

    onActivityResult中获得选择的图像

          Uri uri = data.getData();        TextView statusText = (TextView)mContentView.findViewById(R.id.status_text);        statusText.setText("Sending: "+uri);        Intent i = new Intent(getActivity(), FileTransferService.class);        i.setAction(FileTransferService.ACTION_SEND_FILE);        i.putExtra(FileTransferService.EXTRAS_FILE_PATH, uri.toString());        i.putExtra(FileTransferService.EXTRAS_GROUP_ADDRESS,   info.groupOwnerAddress.getHostAddress());        i.putExtra(FileTransferService.EXTRAS_GROUP_PORT, 8988);        getActivity().startService(i); 

Server端核心代码

在设备连接之后,server就通过ServerSocket一直监听client端的连接,一旦有client的请求,将client发来的数据
保存在本地,需要通过线程处理

    public static class FileServerAsnycTask extends AsyncTask<Void,Void,String>{      private Context context;      private TextView statusText;      public FileServerAsnycTask(Context context,View statusText){          this.context  = context;          this.statusText = (TextView)statusText;      }      @Override      protected String doInBackground(Void... params) {          try{              //创建socket监听              ServerSocket socket = new ServerSocket(8988);              Socket client = socket.accept();              //一旦有client端的连接,就接收client发来的数据并处理              final File f = new File(Environment.getExternalStorageDirectory()+"/"+              context.getPackageName()+"/wifishared-"+System.currentTimeMillis()+".jpg");              File dirs = new File(f.getParent());              if(!dirs.exists())                  dirs.mkdirs();              f.createNewFile();              InputStream is = client.getInputStream();              copyFile(is, new FileOutputStream(f));              socket.close();              return f.getAbsolutePath();          }catch(Exception e){              return null;          }      }        //接受完成之后,可以通过相册打开查看        @Override        protected void onPostExecute(String result) {          if(result != null){              statusText.setText("File copied - "+result);              Intent i = new Intent();              i.setAction(Intent.ACTION_VIEW);              i.setDataAndType(Uri.parse("file//"+result), "image/*");              context.startActivity(i);          }      }    }

完整的代码请查看

测试可以在两个手机同时安装这个程序,一个手机是client端,一个手机是server端,连接之后,就可以相互传数据
完整的代码

更多相关文章

  1. Android(安卓)数据操作(一) 自定义AttributeSet属性
  2. Android中RecyclerView调用notifyDataSetChanged方法无效
  3. Android(安卓)深入理解Loader机制 让APP轻装上阵
  4. Android(安卓)Studio常用快捷键
  5. 一种 Android(安卓)应用内全局获取 Context 实例的装置
  6. Android代码的工程分为三个部分
  7. Android(安卓)Studio如何设置代码自动提示
  8. Android(安卓)Studio提高开发效率必备神器 - JRebel for Android
  9. Android(安卓)SDCard UnMounted 流程分析(一)

随机推荐

  1. android:设计一个具有3个选项的菜单程序,
  2. 【Android】Suggestion: use tools:overr
  3. SDK无法下载更新的问题
  4. [Android]可自定义显示时长的Toast
  5. Android通过网络URL获取图片并显示
  6. android post方式传递参数并获取返回数据
  7. 解决安卓9.0版本不能访问http请求问题
  8. Android底部弹出的popupWindow
  9. Android UTF-8转码
  10. Android笔试题-基础