Android實踐 -- Android Wi-Fi 直連 傳輸數(shù)據(jù)

Android Wi-Fi直連 傳輸數(shù)據(jù)

一旦兩個設(shè)備之間建立了Wi-Fi直連,那么這兩個設(shè)備之間就可以通過socket傳輸數(shù)據(jù)大概得步驟如下:

  • 通過ServerSocket創(chuàng)建一個server端,在后臺一直堅挺是否有client端連接
  • 通過Socket建立一個client端昌抠,根據(jù)server端的ip和port,連接到server端
  • 建立連接之后译蒂,通過client向server端發(fā)送數(shù)據(jù)
  • server端接到數(shù)據(jù)之后,可以對數(shù)據(jù)做對應(yīng)的處理

Client端的核心邏輯

  • 在服務(wù)中創(chuàng)建一個client谊却,并發(fā)送數(shù)據(jù)

      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);
                  //根據(jù)server端的地址和端口建立socket柔昼,并設(shè)置超時
                  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));
                  //發(fā)送數(shù)據(jù)
                  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端核心代碼

在設(shè)備連接之后炎辨,server就通過ServerSocket一直監(jiān)聽client端的連接捕透,一旦有client的請求,將client發(fā)來的數(shù)據(jù)
保存在本地,需要通過線程處理

  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{
            //創(chuàng)建socket監(jiān)聽
            ServerSocket socket = new ServerSocket(8988);
            Socket client = socket.accept();
            //一旦有client端的連接碴萧,就接收client發(fā)來的數(shù)據(jù)并處理
            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);
        }
    }
  }

完整的代碼請查看

測試可以在兩個手機(jī)同時安裝這個程序,一個手機(jī)是client端勿决,一個手機(jī)是server端乒躺,連接之后招盲,就可以相互傳數(shù)據(jù)
完整的代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末低缩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子曹货,更是在濱河造成了極大的恐慌咆繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶籽,死亡現(xiàn)場離奇詭異玩般,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)礼饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門坏为,熙熙樓的掌柜王于貴愁眉苦臉地迎上來究驴,“玉大人,你說我怎么就攤上這事匀伏∪饔牵” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵够颠,是天一觀的道長熙侍。 經(jīng)常有香客問我,道長履磨,這世上最難降的妖魔是什么蛉抓? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剃诅,結(jié)果婚禮上巷送,老公的妹妹穿的比我還像新娘。我一直安慰自己矛辕,他們只是感情好惩系,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著如筛,像睡著了一般堡牡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杨刨,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天晤柄,我揣著相機(jī)與錄音,去河邊找鬼妖胀。 笑死芥颈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赚抡。 我是一名探鬼主播爬坑,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涂臣!你這毒婦竟也來了盾计?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤赁遗,失蹤者是張志新(化名)和其女友劉穎署辉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岩四,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡哭尝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剖煌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片材鹦。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡逝淹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桶唐,到底是詐尸還是另有隱情创橄,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布莽红,位于F島的核電站妥畏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏安吁。R本人自食惡果不足惜醉蚁,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鬼店。 院中可真熱鬧网棍,春花似錦、人聲如沸妇智。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巍棱。三九已至惑畴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間航徙,已是汗流浹背如贷。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留到踏,地道東北人杠袱。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像窝稿,于是被迫代替她去往敵國和親楣富。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理伴榔,服務(wù)發(fā)現(xiàn)纹蝴,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • #Android 基礎(chǔ)知識點總結(jié) ---------- ##1.adb - android debug bridg...
    Mythqian閱讀 3,252評論 2 11
  • 上篇文章介紹了IPC機(jī)制的基本概念以及簡單使用,文章鏈接:Android 關(guān)于IPC機(jī)制的理解(一) 這篇文章主要...
    老實任閱讀 706評論 0 2
  • 以后每次因為渣男難過就反省自己吧秉馏,罵自己傻逼。 今天又發(fā)現(xiàn)了自己的兩個問題脱羡。 一是太理想完美幻想主義萝究,今天俄語課看...
    安槿Boa閱讀 192評論 0 0
  • 有句話說:“能用錢解決的事情都不是大事”免都。這個觀點是出于真正發(fā)生與錢無關(guān)的事情的時候,不用錢來解決帆竹。 ...
    五一媽閱讀 204評論 0 0