1. 程式人生 > >Rosmin--兩臺Android手機的Socket雙向通訊

Rosmin--兩臺Android手機的Socket雙向通訊

 上學期搞定了小車,現在終於結束了大機器人,趁還沒真正進入考研複習的高潮趕緊把以前的程式碼整理整理。

       先講講我們那小車,2臺手機+車體組成。一個手機放車上作為server,用其攝像頭、陀螺儀、磁力計來獲取影象、確定小車方向。另一臺手機負責控制,作為client,並畫出小車行進圖。如何從server獲取陀螺儀、磁力計角度,又如何把client的控制命令傳送給server就成了一個問題。這裡我們使用socket雙向通訊。

       先講client部分

  1. // Socket Client connect to Server
  2.     connectButton.setOnClickListener(new
     Button.OnClickListener()  
  3.     {  
  4.       @Override
  5.       publicvoid onClick(View v)  
  6.       {  
  7.         // TODO Auto-generated method stub
  8.         try
  9.         {  
  10.           ip = mEditText02.getText().toString();  
  11.           Thread thread = new Thread(new mSocketConnectRunnable2());  
  12.           thread.start();  
  13. //          thread.sleep(100);
  14.           goToControl();           //進行控制命令的處理
  15.           connectButton.setVisibility(View.INVISIBLE);  
  16.           mEditText02.setVisibility(View.INVISIBLE);  
  17.         }  
  18.         catch (Exception e)   
  19.         {  
  20.           e.printStackTrace();  
  21.         }  
  22.       }  
  23.     });    

      兩臺手機都連線到同個wifi,這個就不多講了。首先你得有個EditText填寫server的IP地址,然後有個按鈕,點選啟動個執行緒,負責與server通訊,這裡傳給Thread的建構函式呼叫Runnable介面。socket其實就是對某一個伺服器的一個埠進行連線,連線上後就形成會話。由於這裡socket是全雙向的位元組流,所以連上的時候其本身就已經具備了雙向通訊能力。

      然後我們看它呼叫的介面,怎麼連線和接受server發來的資料……

  1. //Socket Client
  2.  publicclass mSocketConnectRunnable2 implements Runnable  
  3.  {           
  4.    @Override
  5.    publicvoid run()  
  6.    {  
  7.      try
  8.      {  
  9.     mSocket02 = new Socket(ip, intSocketServerPort);  
  10.     if(mSocket02.isConnected())  
  11.        {  
  12.          Log.i(TAG, "Socket Client is connected to Server.");  
  13.          strTemp01="Socket Client is connected to Server.";         
  14.        }  
  15.        BufferedReader br = new BufferedReader(new InputStreamReader(mSocket02.getInputStream()));  
  16.        while (true)  
  17.        {  
  18.         strTemp01 = br.readLine();  
  19.         if(!strTemp01.isEmpty())  
  20.           handler.post(rReceiveInfo);             
  21.        }  
  22.      }  
  23.      catch(Exception e)  
  24.      {  
  25.        if(bIfDebug)  
  26.        {  
  27.          Log.e(TAG, e.toString());  
  28.          e.printStackTrace();  
  29.        }  
  30.      }  
  31.    }  
  32.  }  

         ip上面說了,intSocketServerPort是socket埠,我這裡設定為8080。mSocket02就像個水管,可以往裡灌水也可以抽水。這裡通過BufferedReader獲得位元組流,用handler傳遞進行資料處理。這裡推薦用handler,不僅增加程式碼可度性,更容易避免莫名其妙的bug……

        以上是建立socket連線並且從server獲取位元組流的過程,下面是傳送位元組流的部分……

  1. publicstaticvoid action(String a){  
  2.     //當Socket連線正常且不為空時,流輸出給server
  3.     if(mSocket02!=null && mSocket02.isConnected() && !a.equals(""))  
  4.     {   
  5.       try
  6.       {               
  7.         bw = new BufferedWriter(new OutputStreamWriter(mSocket02.getOutputStream()));            
  8.         bw.write(a+"\n");  
  9.         bw.flush();           
  10.       }  
  11.       catch (Exception e)  
  12.       {  
  13.           Log.e(TAG, e.toString());  
  14.           e.printStackTrace();  
  15.         }  
  16.     }  
  17.   }  

         這裡,比如我用 action("forward"),則位元組流將forward發往server,至於這裡流輸出,不過多解釋,詳細的需要自己仔細檢視socket。

         然後是server部分……這裡我們設定一個按鈕用於開啟socket server

  1. // Run Socket Server
  2.     mButton01.setOnClickListener(new Button.OnClickListener()  
  3.     {  
  4.       @Override
  5.       publicvoid onClick(View v)  
  6.       {  
  7.         // TODO Auto-generated method stub
  8.         mButton01.setEnabled(false);  
  9.         mButton02.setEnabled(true);  
  10.         setContentView(R.layout.i3);  
  11.         Thread thread = new Thread(new mSocketConnectRunnable1());  
  12.         thread.start();  
  13.       }  
  14.     });  
         這裡也是用Thread的建構函式呼叫Runnable介面
  1. //Socket Server
  2.  publicclass mSocketConnectRunnable1 implements Runnable  
  3.  {  
  4.    @Override
  5.    publicvoid run()  
  6.    {  
  7.      // TODO Auto-generated method stub
  8.      try
  9.      {  
  10.        mServerSocket01 = new ServerSocket(intSocketServerPort);  
  11.        mServerSocket01.setReuseAddress(true);  
  12.        Log.i(TAG, strDebugPreFix+"Socket Server is Running: "+intSocketServerPort);  
  13.        while (!mServerSocket01.isClosed())  
  14.        {    
  15.          mSocket01 = mServerSocket01.accept();  
  16.          Thread read = new Thread(new Runnable()  
  17.          {  
  18.            BufferedReader br = new BufferedReader(new InputStreamReader(mSocket01.getInputStream()));   
  19.            @Override
  20.            publicvoid run()  
  21.            {  
  22.              try
  23.              {                               
  24.                while (mSocket01.isConnected())  
  25.                {                    
  26.                  msg = br.readLine();  
  27.                  Handler01.post(rManualControl);  
  28.                }  
  29.              }  
  30.              catch (Exception e)  
  31.              {  
  32.                if(bIfDebug)  
  33.                {  
  34.                  Log.e(TAG, e.toString());  
  35.                  e.printStackTrace();  
  36.                }  
  37.              }              
  38.            }  
  39.          });  
  40.          read.start();         
  41.          //在接受資料的同時傳送資料,實現雙向通訊
  42.        Thread write = new Thread (new Runnable()  
  43.        {  
  44.          @Override
  45.          publicvoid run()  
  46.          {  
  47.            while (mSocket01.isConnected())  
  48.            {  
  49.              try
  50.              {  
  51.                Thread.sleep(100);  
  52.              }  
  53.              catch (InterruptedException e)  
  54.              {  
  55.                // TODO Auto-generated catch block
  56.                e.printStackTrace();  
  57.              }  
  58.              Handler01.post(rSendStr);  
  59.            }  
  60.          }  
  61.        });  
  62.         write.start();  
  63.        }  
  64.      }     
  65.      catch(Exception e)  
  66.      {  
  67.        if(bIfDebug)  
  68.        {  
  69.          Log.e(TAG, e.toString());  
  70.          e.printStackTrace();  
  71.        }  
  72.      }  
  73.    }  
  74.  }    
  1. public Runnable rSendStr = new Runnable(){  
  2.     publicvoid run()  
  3.     {  
  4. 相關推薦

    Rosmin--Android手機Socket雙向通訊

     上學期搞定了小車,現在終於結束了大機器人,趁還沒真正進入考研複習的高潮趕緊把以前的程式碼整理整理。        先講講我們那小車,2臺手機+車體組成。一個手機放車上作為server,用其攝像頭、陀螺儀、磁力計來獲取影象、確定小車方向。另一臺手機負責控制,作為cl

    android裝置間通過OTG-USB連線,實現通訊android裝置間的通訊

    public class ChatActivity extends BaseChatActivity {     private final AtomicBoolean keepThreadAlive = new AtomicBoolean(true);     private final List<

    android AIDL 01 雙向通訊

    1、概述 AIDL是一個縮寫,全稱是Android Interface Definition Language,也就是Android介面定義語言。是的,首先我們知道的第一點就是:AIDL是一種語言。既然是一種語言,那麼相應的就很自然的衍生出了一些問題: 為什麼要設計出這麼

    Android 跨程序雙向通訊(Messenger與AIDL)詳解

    今天這篇文章主要講一下Messenger與AIDL的區別、優缺點以及各自的使用方法。 Messenger與AIDL的異同 一、Messenger與AIDL相同點 1.都與IPC的呼叫有關; 2.Messenger 是一種輕量級的

    推薦Android手機上比較好用免費的SSH客戶端APP

    我平時比較常用的兩個手機SSH客戶端APP,JuiceSSH 和 阿里雲APP 最好用的感覺還是 JuiceSSH ,配色介面比較友好,操作都非常方便 上圖看看吧: 字型大小可以按音量鍵隨意調整(注意需要先隱藏鍵盤) 這是個免費APP

    Android使用Socket進行通訊

    Java能接受其他通訊實體連線請求的類是ServerSocket,ServerSocket物件用於監聽客戶端的Socket連線,如果沒有連線,它將一直處於等待狀態。 public class Si

    C語言實現電腦通過串列埠通訊

    用C語言實現在傳送端控制檯輸入字串並在接收端接收顯示的功能。 /*********************server.c****************/#include<stdio.h>#include<sys/types.h>#include

    [Android]Service和Activity雙向通訊種方式

    本文原始碼:https://github.com/gitEkko/MyApplication.git Service簡介 Service是android 系統中的四大元件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟 A

    Android 使用socket實現個真機之間的通訊

    1、使用Socket進行兩個手機之間的通訊需要安裝兩個不同的程式碼檔案:服務端和客戶端   分別進行安裝 2、建立區域網:兩個手機同時連一個WiFi或者兩個手機進行熱點和WLAN連線 3、客戶端連線另一個手機IP時把另一個手機的IP改成靜態IP(3的第二種方法做這個步驟)

    利用ddmlib 實現 PC端與android手機端adb forword socket通訊

    上篇文章講了PC與android手機連線的辦法 ,通過java呼叫系統命令執行adb命令操作,實際上是一個比較笨的辦法。 網上查閱資料,發現google 提供了ddmlib庫 (adt-bundle\sdk\tools 目錄下), 提供了adb相關操作的所有api。 文件

    windows socket程式設計實現電腦間的通訊

    首先需要兩臺電腦,可以兩個同學共同來完成;當然,如果自己有兩臺電腦的話就更好了! 在一臺電腦上建立一個TCP Socket伺服器應用程式 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include

    Appium 連手機失敗Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localhost undefined:4724

    callback and ddr call all trap span localhost 錯誤 問題:Appium執行,連接手機報下面的錯誤 Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTF

    android視頻雙向實時通訊的橫豎屏切換

    config 使用 hidden boa 實時 extend 就會 lan 屬性設置 大概的樣子是醬嬸兒的    點擊全屏按鈕時執行setRequestedOrientation方法,此時希望得到的結果是surfaceview界面全屏且橫屏顯示,並且在橫屏時Activity

    socket實現FTP服務器指定目錄下的文件轉移(不依賴第三方jar包)

    gets util new ram ali ftp文件 turn tps lap 通過socket實現兩臺FTP服務器指定目錄下的文件轉移,其中包含了基礎了ftp文件列表顯示、上傳和下載。這裏僅供學習用,需掌握的點有socket、ftp命令、文件流讀取轉換等 完整代碼如下:

    網路程式設計(InetAddress類、Socket和ServerSocket、實現客戶端和伺服器之間的雙向通訊

    網路程式設計的底層是IO,通過IO將一臺計算機中的資料傳送到另一臺計算機中。傳送的時候,要知道接受方的地址,該地址即為IP地址。知道IP地址後即可進行傳送。A向B發訊息,訊息是發過去了,但是B要怎樣接受呢?因此定義了埠,B監聽了A所使用的埠。A發的訊息中含有埠號,當B接受到訊息時,知道了埠號

    Android IPC程序間通訊(六)Socket

    網路通訊之Socket 特點:功能強大,可通過網路傳輸位元組流,支援一對多併發即時通訊。 不支援RPC。 服務端實現: public class SorviceSocket extends Service { private static final String TAG

    AndroidSocket通訊

    Android裡面使用Socket與伺服器之間進行通訊: 首先建立一個SocThread類 package com.junto.sockettest; import android.content.Context; import android.content.SharedPref

    Socket跨平臺通訊——服務端Android、客戶端iOS

    本文講述了: 1、如何在Android上搭建Mina服務端(使用Mina 2.0.15、程式設計環境Eclipse); 2、如何在iOS上建立Socket客戶端(使用CocoaAsyncSocket第三方通訊框架、Swift3.0); 3、Android iOS間的TCPS

    Android Socket連線,使用Socket進行通訊(Android)

    一。伺服器程式 伺服器程式需要在PC上執行,該程式比較的簡單,因此不需要建立Android專案,直接定義一個JAVA類,並且執行該類即可。它僅僅建立ServerSocket監聽,並使用Socket獲取輸入輸出流。 SimpleServer import java.io.IOEx