1. 程式人生 > >Android java和C的Socket通訊demo(可用)

Android java和C的Socket通訊demo(可用)

原址

關於Android應用與Framework的socket通訊,相信關心這個問題的朋友們已經看過《android使用socket使底層和framework通訊》這篇文章,美中不足的是作者只貼出一些關鍵的程式碼片段而並沒有放出原始碼。我這裡還是以一個能實際執行的例子為基礎來講,這樣也方便大家學習。

首先看一下效果,如下圖。我填寫姓名"Potter",選擇性別"Mr"然後點擊發送,底層socket收到訊息後將訊息直接返回給我,我將返回的結果(Mr.Potter)直接顯示在Result。


ok,有了初步瞭解後我們現在來看一下如何一步步實現這個例子。

1、配置init.rc。我在init.rc加入如下配置

  1. service htfskservice /system/bin/htfsk  
  2.    socket htfsk stream 666 system system  
  3.    class core
  4.    user root
  5.    group root
  6.    oneshot  

這裡配置了一個名為 “htfskservice” 的服務,手機開機後該服務會自啟動並執行/system/bin目錄下的指令碼htfsk(步驟二將提到如何生成這個指令碼)。

同時這裡還配置了一個名為 "htfsk" 的socket,並且只有擁有system許可權的應用才允許連線這個socket,如何使應用獲取system許可權可以參考

http://my.unix-center.net/~Simon_fu/?p=531這篇文章。

2、編寫socket服務端程式碼,生成可執行指令碼htfsk。

首先來看下socket服務端程式碼 htfsk.c ,內容如下:

  1. #define SOCKET_NAME "htfsk"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <sys/socket.h>
  9. #include <sys/wait.h>
  10. #include <sys/un.h>
  11. #include <cutils/sockets.h>
  12. #include <utils/Log.h>
  13. #include <android/log.h>
  14. int main(){  
  15.     char log[200];   
  16.     int connect_number = 6;  
  17.     int fdListen = -1, new_fd = -1;  
  18.     int ret;  
  19.     struct sockaddr_un peeraddr;  
  20.     socklen_t socklen = sizeof (peeraddr);  
  21.     int numbytes ;  
  22.     char buff[256];  
  23.     //這一步很關鍵,就是獲取init.rc中配置的名為 "htfsk" 的socket
  24.     fdListen = android_get_control_socket(SOCKET_NAME);  
  25.     if (fdListen < 0) {  
  26.     sprintf(log,"Failed to get socket '" SOCKET_NAME "' errno:%d", errno);  
  27.     __android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log);   
  28.     exit(-1);  
  29.     }  
  30.     //開始監聽
  31.     ret = listen(fdListen, connect_number);      
  32.     sprintf(log,"Listen result %d",ret);  
  33.     __android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log);   
  34.     if (ret < 0) {  
  35.         perror("listen");  
  36.         exit(-1);  
  37.     }  
  38.     //等待Socket客戶端發啟連線請求
  39.     new_fd = accept(fdListen, (struct sockaddr *) &peeraddr, &socklen);  
  40.     sprintf(log,"Accept_fd %d",new_fd);  
  41.     __android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log);   
  42.     if (new_fd < 0 ) {  
  43.         sprintf(log,"%d",errno);  
  44.         __android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log);   
  45.         perror("accept error");  
  46.         exit(-1);  
  47.     }  
  48.     while(1){  
  49.     //迴圈等待Socket客戶端發來訊息
  50.     __android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI","Waiting for receive");  
  51.     if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1){  
  52.         sprintf(log,"%d",errno);  
  53.         __android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log);   
  54.         perror("recv");  
  55.         continue;  
  56.     }  
  57.     //傳送訊息回執給Socket客戶端
  58.     if(send(new_fd,buff,strlen(buff),0)==-1)  
  59.     {  
  60.         perror("send");  
  61.         close(new_fd);  
  62.         exit(0);  
  63.     }         
  64.     }  
  65.     close(new_fd);  
  66.     close(fdListen);  
  67.     return 0;  
  68. }  

寫好服務端程式碼後我們要將他編譯成可執行指令碼htfsk,編譯的Android.mk內容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS :=optional
LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
LOCAL_SHARED_LIBRARIES := libcutils liblog
LOCAL_MODULE:= htfsk
LOCAL_SRC_FILES:=htfsk.c
LOCAL_PRELINK_MODULE := false
include $(BUILD_EXECUTABLE)

編譯成功後就會在/system/bin/目錄下找到生成的可執行指令碼htfsk

3、編寫客戶端Java程式碼。核心程式碼如下:

  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4. import java.io.PrintWriter;  
  5. import android.net.LocalSocket;  
  6. import android.net.LocalSocketAddress;  
  7. import android.util.Log;  
  8. /** 
  9.  * Socket客戶端 
  10.  *  
  11.  * @author lai_zs 
  12.  * @date:2012-3-17 下午12:15:09 
  13.  */
  14. publicclass SocketClient {  
  15.     privatefinal String SOCKET_NAME = "htfsk";  
  16.     private LocalSocket client;  
  17.     private LocalSocketAddress address;  
  18.     privateboolean isConnected = false;  
  19.     privateint connetTime = 1;  
  20.     public SocketClient() {  
  21.         client = new LocalSocket();  
  22.         address = new LocalSocketAddress(SOCKET_NAME, LocalSocketAddress.Namespace.RESERVED);  
  23.         new ConnectSocketThread().start();  
  24.     }  
  25.     /** 
  26.      * 傳送訊息 
  27.      * @param msg 
  28.      * @return 返回Socket服務端的訊息回執 
  29.      */
  30.     public String sendMsg(String msg) {  
  31.         if (!isConnected) {  
  32.             return"Connect fail";  
  33.         }  
  34.         try {  
  35.             BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
  36.             PrintWriter out = new PrintWriter(client.getOutputStream());  
  37.             out.println(msg);  
  38.             out.flush();  
  39.             return in.readLine();  
  40.         } catch (IOException e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.         return"Nothing return";  
  44.     }  
  45.     /** 
  46.      * 非同步連線Socket,如果連線不上會嘗試重複連線十次 
  47.      *  
  48.      * @author Administrator 
  49.      *  
  50.      */
  51.     privateclass ConnectSocketThread extends Thread {  
  52.         @Override
  53.         publicvoid run() {  
  54.             while (!isConnected && connetTime <= 10) {  
  55.                 try {  
  56.                     sleep(1000);  
  57.                     Log.i("SocketClient","Try to connect socket;ConnectTime:"+connetTime);  
  58.                     client.connect(address);  
  59.                     isConnected = true;  
  60.                 } catch (Exception e) {  
  61.                     connetTime++;  
  62.                     isConnected = false;  
  63.                     Log.i("SocketClient","Connect fail");  
  64. 相關推薦

    Android javaC的Socket通訊demo(可用)

    原址 關於Android應用與Framework的socket通訊,相信關心這個問題的朋友們已經看過《android使用socket使底層和framework通訊》這篇文章,美中不足的是作者只貼出一些關鍵的程式碼片段而並沒有放出原始碼。我這裡還是以一個能實際執行的例子為基礎

    Android Javajs互調案例演示(HTML5混合開發)

    WebView相關知識-案例1 1.載入網頁要用WebView控制元件 2.要想支援js就要設定 webview.getSettings().setJavaScriptEnabled(true); 3.webview.loadUrl可以載入本地的html頁面也可以載入網路html頁面,還可以呼叫js的

    java 後臺android 互動 保持session通訊

    主要實現是:使用者登入成功後返回sessionID 給app ,app 上需要使用者登入後才能操作的,在每次請求的時候把sessionID 當成引數傳過來。 web.xml程式碼:(主要是建立一個監聽) <listener> <listener-clas

    android -------- java虛擬機Dalvik虛擬機

    png 設計 依賴 zygote virtual 孵化器 公司 運行時 ble java虛擬機 虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java虛擬機

    web3j開發以太坊智能合約快速入門(特別適合javaandroid開發者)

    latest struct name admin 套接字 信息 mes add decimal web3j簡介 web3j是一個輕量級、高度模塊化、響應式、類型安全的Java和Android類庫提供豐富API,用於處理以太坊智能合約及與以太坊網絡上的客戶端(節點)進行集成。

    簡單的入門Android開發Java語言基礎[圖]

    span 如何 都是 android 類繼承 try alt 不依賴 throw 簡單的入門Android開發和Java語言基礎[圖]前言:去年年底到今年年初,我做過簡單的智能家居,也實現過一些簡單的直連和遠程的智能家居。於是就將最簡單的通信發布出來:智能家居簡單實現—使用

    java ScannerRandom的Demo

    import java.util.Scanner;//匯入包 import java.util.Random; public class ScannerDemo{ public static void main(String[] args){ //Scanner輸入的演示=============

    android進階3step2:Android App通訊——HttpsHttp通訊

     需要了解的知識  X.509數字證書的結構與解析 計算機網路:這是一份全面& 詳細 HTTP知識講解  Https 實戰 • 主要用到的API介紹 – HttpsURLConnection (HttpURLConn

    javaAndroid好的學習網址收集

    Android學習篇 1,Android入門基礎教程:非常全面,作為我入門的必看教程啦  點選開啟連結  www.runoob.com/w3cnote/android-tutorial-handler-message.html 2、android開發教程21篇

    萬樹:JavaAndroid有什麼聯絡?有什麼區別?學哪個好?

        從整體來講,Java和Android的區別在於Android程式是基於元件和配置的,而且Android開發以Java語言為開發工具,表面上看他們有點同宗不同門,但實際上區別十分大,Android是一個主流智慧手機作業系統,Java是一種開發語言,兩者沒有好壞之分,而且

    JavaAndroid配置環境變數,步驟

    0, 1, 2,lib資料夾下的dt.jar和tools.jar兩個檔案 3, 4,Path中放入:                   %JAVA_HOME%\bin;%JAVA

    react-native-android-unity(三)android原生unity互相通訊

    一、android向unity傳送訊息  這個比較比較簡單,unity匯出android的程式碼包,顳部提供了介面,在UnityActivity加入如下程式碼:mUnityPlayer.UnitySe

    java多執行緒 demo ,包含帶返回值的Callable不帶返回值的Runnable

    輸入int,利用callable取得double值,再用runnable列印 import java.util.concurrent.*; public class TestMultiThread { private static ExecutorService pool = nul

    [Android]ServiceActivity雙向通訊的兩種方式

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

    學習JavaAndroid的各類資源網址

    開源中國 www.oschina.net 是目前中國最大的開源技術社群。我們傳播開源的理念,推廣開源專案,為 IT 開發者提供了一個發現、使用、並交流開源技術的平臺。目前開源中國社群已收錄超過兩萬款開源軟體。建立自己的QwtPlot(1)     增加一個類比如curveP

    [譯] 最佳安全實踐:在 Java Android 中使用 AES 進行對稱加密

    原文地址:Security Best Practices: Symmetric Encryption with AES in Java and Android 原文作者:Patrick Favre-Bulle 最佳安全實踐:在 Java 和 Android 中使用 AES 進行

    WebSocket在服務端客戶端通訊demo,支援心跳檢測+斷線重連

    一、為什麼需要 WebSocket? 初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什麼還需要另一個協議?它能帶來什麼好處? 答案很簡單,因為 HTTP 協議有一個缺陷:通訊只能由客戶端發起。 舉例來說,我們想了解今天的天氣,只能是客戶端向伺服器發出

    我看不下去鳥。。。。JavaC#的socket通訊真的簡單嗎?

    這幾天在部落格園上看到好幾個寫Java和C#的socket通訊的帖子。但是都為指出其中關鍵點。 C# socket通訊元件有很多,在vs 使用nuget搜尋socket元件有很多類似的。本人使用的是自己開發的一套元件。 Java socket通訊的元件也有很多,常用的大多數都是用的mina或者netty。

    android java層直接kernel互動的最快的方法

    http://blog.csdn.net/zengkexu/article/details/8805339  android java 和kernel 的互動方式  按照常規的要通過JNI實現, 然後jni 呼叫HAL的IOCTL ,或者類似Vold 中建立netli

    javaandroid SDK環境變數配置過程(windows)

    本機java環境變數配置: JAVA_HOME:   D:\java\jdk1.8.0_112   CLASSPATH:   .%JAVA_HOME%\lib;%JAVA_HOME%\lib\to