关于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通信相关推荐

  1. 基于Java的TCP Socket通信详解(计算机端/Android手机端)

    TCP Socket通信是一种比较常用的基于连接的网络通信方式.本文通过Java实现TCP Socket通信,并将其用于计算机端.Android手机端,同时做到代码规范化,实现代码最大化复用. 本文代 ...

  2. Android Java 必备:Socket通信

    目标 Demo是通过Java ServerSocket 和 Socket 通信实现客户端发送消息和发送文件到服务器,服务器接收到消息和文件,并且实现解决inputStream.read()的阻塞问题思 ...

  3. 基于Java NIO的Socket通信

    基于Java NIO的Socket通信 Java NIO模式的Socket通信,是一种同步非阻塞IO设计模式,它为Reactor模式实现提供了基础. 下面看看,Java实现的一个服务端和客户端通信的例 ...

  4. java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码

    本篇文章主要介绍了java中处理socket通信过程中粘包的情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添 ...

  5. c 和java通讯大小端问题处理_记录一个如何解决java与C++socket通信的大小端问题...

    问题背景 oracle jdk默认的socket通信发送int类型数据高位优先.下面是jdk包内部相关源码.(模拟)os.write((len >>> 24) & 0xFF) ...

  6. Android客户端与PC服务器如何实现Socket通信

    转载链接←←←← 本文介绍Android终端持续扫描AP信息并发送给服务器端的实现.首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路.使用ServerSocket创建TCP服务器端 ...

  7. java大小端字节流解析_记录一个如何解决java与C++socket通信的大小端问题

    问题背景 oracle jdk默认的socket通信发送int类型数据高位优先.下面是jdk包内部相关源码.(模拟) os.write((len >>> 24) & 0xFF ...

  8. java与c++ socket通信_C++ socket 客户端与JAVA socket 服务端通信汗血宝马

    C++ socket 连接java 服务如果发送 packHeadLength+消息体 java 客户端代码 Socket socket = new Socket("127.0.0.1&qu ...

  9. java android消息推送_Android中使用socket通信实现消息推送的方法详解

    原理最近用socket写了一个消息推送的demo,在这里和大家分享一下. 主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ. 效果图: 原理: ...

最新文章

  1. 理解Java中的弱引用(Weak Reference)
  2. 答案计算机应用技术试卷,计算机应用与技术试卷A及答案
  3. python填充空值_Python机器学习(九十一)Pandas 填充(Imputation)空值
  4. 使用未初始化的内存是什么意思_单根内存条的极限容量是多少?内存条上的2R X 8代表了什么意思?...
  5. php mysql 表关联,mysql的多表关联_MySQL
  6. 云管边端架构图_中移物联网布局构建“云-管-端”全方位体系架构
  7. 时间序列趋势分解 seasonal_decompose
  8. 10-Mybatis 多表查询之多对多
  9. java多线程常用方法_Java多线程入门中几个常用的方法
  10. 安装Python和Anaconda
  11. TCP/IP——TCP数据包分析
  12. One-shot Face Reenactment(BMVC19)
  13. 计算机关机键 自动重启,电脑关机后自动重启怎么办?原因及解决方详解
  14. adobe dreamweaver cs6 css,Adobe Dreamweaver CS6
  15. 灵巧好用的手机便签软件
  16. Windows API串口编程详解
  17. 在python里调用c++的DLL出现Windows Error -529697949
  18. 平面设计常见的配色方案及色标
  19. VB程序中的反三角函数
  20. 木板切割问题——贪心

热门文章

  1. php 光速,PHP的光速教程
  2. 服务器定期巡检项目,服务器定期巡检制度..docx
  3. java中输出时 什么作用_JAVA中输入和输出处理(Java I/O)重点总结
  4. 连云港职业技术学院有计算机系吗,连云港职业技术学院电子信息工程技术专业...
  5. python list_Python中的基本list操作
  6. python中二进制文件_Python学习基础篇 -6: Python中的文件操作
  7. php引入类的位置,php如何在一个类中引入另外一个类
  8. python 查看已经安装的模块_教你用Python查看模块的帮助文档,方法和帮助信息...
  9. 尽量使用const、enum、inline代替#define
  10. 【深度学习】查准率、召回率、AP、mAP