android的NDK和java进行本地socket通信
生活随笔
收集整理的這篇文章主要介紹了
android的NDK和java进行本地socket通信
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
關(guān)于Android應(yīng)用與Framework的socket通信,相信關(guān)心這個問題的朋友們已經(jīng)看過《android使用socket使底層和framework通信》這篇文章,美中不足的是作者只貼出一些關(guān)鍵的代碼片段而并沒有放出源碼。我這里還是以一個能實際運行的例子為基礎(chǔ)來講,這樣也方便大家學(xué)習(xí)。
????首先看一下效果,如下圖。我填寫姓名"Potter",選擇性別"Mr"然后點擊發(fā)送,底層socket收到消息后將消息直接返回給我,我將返回的結(jié)果(Mr.Potter)直接顯示在Result。
編寫socket服務(wù)端代碼,生成可執(zhí)行腳本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];//這一步很關(guān)鍵,就是獲取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);}//開始監(jiān)聽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客戶端發(fā)啟連接請求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){//循環(huán)等待Socket客戶端發(fā)來消息__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;}//發(fā)送消息回執(zhí)給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();}/*** 發(fā)送消息* @param msg* @return 返回Socket服務(wù)端的消息回執(zhí)*/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,如果連接不上會嘗試重復(fù)連接十次* * @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");}}}}/*** 關(guān)閉Socket*/public void closeSocket() {try {client.close();} catch (IOException e) {e.printStackTrace();}}}?
總結(jié)
以上是生活随笔為你收集整理的android的NDK和java进行本地socket通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven小节,Nexus私服,构件打包
- 下一篇: 使用元数据设计测试用例