日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android的NDK和java进行本地socket通信

發布時間:2025/3/21 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android的NDK和java进行本地socket通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

編寫socket服務端代碼,生成可執行腳本htfsk。

#define SOCKET_NAME "htfsk"#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <sys/un.h> #include <cutils/sockets.h> #include <utils/Log.h> #include <android/log.h>int main(){char log[200]; int connect_number = 6;int fdListen = -1, new_fd = -1;int ret;struct sockaddr_un peeraddr;socklen_t socklen = sizeof (peeraddr);int numbytes ;char buff[256];//這一步很關鍵,就是獲取init.rc中配置的名為 "htfsk" 的socketfdListen = android_get_control_socket(SOCKET_NAME);if (fdListen < 0) {sprintf(log,"Failed to get socket '" SOCKET_NAME "' errno:%d", errno);__android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log); exit(-1);}//開始監聽ret = listen(fdListen, connect_number); sprintf(log,"Listen result %d",ret);__android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log); if (ret < 0) {perror("listen");exit(-1);}//等待Socket客戶端發啟連接請求new_fd = accept(fdListen, (struct sockaddr *) &peeraddr, &socklen);sprintf(log,"Accept_fd %d",new_fd);__android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log); if (new_fd < 0 ) {sprintf(log,"%d",errno);__android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log); perror("accept error");exit(-1);}while(1){//循環等待Socket客戶端發來消息__android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI","Waiting for receive");if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1){sprintf(log,"%d",errno);__android_log_write(ANDROID_LOG_DEBUG,"FTM_JNI",log); perror("recv");continue;}//發送消息回執給Socket客戶端if(send(new_fd,buff,strlen(buff),0)==-1){perror("send");close(new_fd);exit(0);} }close(new_fd);close(fdListen);return 0; }

3、編寫客戶端java代碼。核心代碼如下:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter;import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.util.Log;/*** Socket客戶端* * @author lai_zs* @date:2012-3-17 下午12:15:09*/ public class SocketClient {private final String SOCKET_NAME = "htfsk";private LocalSocket client;private LocalSocketAddress address;private boolean isConnected = false;private int connetTime = 1;public SocketClient() {client = new LocalSocket();address = new LocalSocketAddress(SOCKET_NAME, LocalSocketAddress.Namespace.RESERVED);new ConnectSocketThread().start();}/*** 發送消息* @param msg* @return 返回Socket服務端的消息回執*/public String sendMsg(String msg) {if (!isConnected) {return "Connect fail";}try {BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));PrintWriter out = new PrintWriter(client.getOutputStream());out.println(msg);out.flush();return in.readLine();} catch (IOException e) {e.printStackTrace();}return "Nothing return";}/*** 異步連接Socket,如果連接不上會嘗試重復連接十次* * @author Administrator* */private class ConnectSocketThread extends Thread {@Overridepublic void run() {while (!isConnected && connetTime <= 10) {try {sleep(1000);Log.i("SocketClient","Try to connect socket;ConnectTime:"+connetTime);client.connect(address);isConnected = true;} catch (Exception e) {connetTime++;isConnected = false;Log.i("SocketClient","Connect fail");}}}}/*** 關閉Socket*/public void closeSocket() {try {client.close();} catch (IOException e) {e.printStackTrace();}}}

?

總結

以上是生活随笔為你收集整理的android的NDK和java进行本地socket通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。