Rosmin--兩臺Android手機的Socket雙向通訊
上學期搞定了小車,現在終於結束了大機器人,趁還沒真正進入考研複習的高潮趕緊把以前的程式碼整理整理。
先講講我們那小車,2臺手機+車體組成。一個手機放車上作為server,用其攝像頭、陀螺儀、磁力計來獲取影象、確定小車方向。另一臺手機負責控制,作為client,並畫出小車行進圖。如何從server獲取陀螺儀、磁力計角度,又如何把client的控制命令傳送給server就成了一個問題。這裡我們使用socket雙向通訊。
先講client部分
- // Socket Client connect to Server
-
connectButton.setOnClickListener(new
- {
- @Override
- publicvoid onClick(View v)
- {
- // TODO Auto-generated method stub
- try
- {
- ip = mEditText02.getText().toString();
- Thread thread = new Thread(new mSocketConnectRunnable2());
-
thread.start();
- // thread.sleep(100);
- goToControl(); //進行控制命令的處理
- connectButton.setVisibility(View.INVISIBLE);
- mEditText02.setVisibility(View.INVISIBLE);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
});
兩臺手機都連線到同個wifi,這個就不多講了。首先你得有個EditText填寫server的IP地址,然後有個按鈕,點選啟動個執行緒,負責與server通訊,這裡傳給Thread的建構函式呼叫Runnable介面。socket其實就是對某一個伺服器的一個埠進行連線,連線上後就形成會話。由於這裡socket是全雙向的位元組流,所以連上的時候其本身就已經具備了雙向通訊能力。
然後我們看它呼叫的介面,怎麼連線和接受server發來的資料……
- //Socket Client
- publicclass mSocketConnectRunnable2 implements Runnable
- {
- @Override
- publicvoid run()
- {
- try
- {
- mSocket02 = new Socket(ip, intSocketServerPort);
- if(mSocket02.isConnected())
- {
- Log.i(TAG, "Socket Client is connected to Server.");
- strTemp01="Socket Client is connected to Server.";
- }
- BufferedReader br = new BufferedReader(new InputStreamReader(mSocket02.getInputStream()));
- while (true)
- {
- strTemp01 = br.readLine();
- if(!strTemp01.isEmpty())
- handler.post(rReceiveInfo);
- }
- }
- catch(Exception e)
- {
- if(bIfDebug)
- {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
- }
- }
ip上面說了,intSocketServerPort是socket埠,我這裡設定為8080。mSocket02就像個水管,可以往裡灌水也可以抽水。這裡通過BufferedReader獲得位元組流,用handler傳遞進行資料處理。這裡推薦用handler,不僅增加程式碼可度性,更容易避免莫名其妙的bug……
以上是建立socket連線並且從server獲取位元組流的過程,下面是傳送位元組流的部分……
- publicstaticvoid action(String a){
- //當Socket連線正常且不為空時,流輸出給server
- if(mSocket02!=null && mSocket02.isConnected() && !a.equals(""))
- {
- try
- {
- bw = new BufferedWriter(new OutputStreamWriter(mSocket02.getOutputStream()));
- bw.write(a+"\n");
- bw.flush();
- }
- catch (Exception e)
- {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
- }
這裡,比如我用 action("forward"),則位元組流將forward發往server,至於這裡流輸出,不過多解釋,詳細的需要自己仔細檢視socket。
然後是server部分……這裡我們設定一個按鈕用於開啟socket server
- // Run Socket Server
- mButton01.setOnClickListener(new Button.OnClickListener()
- {
- @Override
- publicvoid onClick(View v)
- {
- // TODO Auto-generated method stub
- mButton01.setEnabled(false);
- mButton02.setEnabled(true);
- setContentView(R.layout.i3);
- Thread thread = new Thread(new mSocketConnectRunnable1());
- thread.start();
- }
- });
- //Socket Server
- publicclass mSocketConnectRunnable1 implements Runnable
- {
- @Override
- publicvoid run()
- {
- // TODO Auto-generated method stub
- try
- {
- mServerSocket01 = new ServerSocket(intSocketServerPort);
- mServerSocket01.setReuseAddress(true);
- Log.i(TAG, strDebugPreFix+"Socket Server is Running: "+intSocketServerPort);
- while (!mServerSocket01.isClosed())
- {
- mSocket01 = mServerSocket01.accept();
- Thread read = new Thread(new Runnable()
- {
- BufferedReader br = new BufferedReader(new InputStreamReader(mSocket01.getInputStream()));
- @Override
- publicvoid run()
- {
- try
- {
- while (mSocket01.isConnected())
- {
- msg = br.readLine();
- Handler01.post(rManualControl);
- }
- }
- catch (Exception e)
- {
- if(bIfDebug)
- {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
- }
- });
- read.start();
- //在接受資料的同時傳送資料,實現雙向通訊
- Thread write = new Thread (new Runnable()
- {
- @Override
- publicvoid run()
- {
- while (mSocket01.isConnected())
- {
- try
- {
- Thread.sleep(100);
- }
- catch (InterruptedException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Handler01.post(rSendStr);
- }
- }
- });
- write.start();
- }
- }
- catch(Exception e)
- {
- if(bIfDebug)
- {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
- }
- }
- public Runnable rSendStr = new Runnable(){
- publicvoid run()
- {
-
相關推薦
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
Android之Socket通訊
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