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" 的socket
fdListen = 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 {
@Override
public 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通信的更多相关文章
- java网络编程Socket通信详解
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- Jmeter自定义编写Java代码调用socket通信
一.前言 最近需要测试一款手机游戏的性能,找不到啥录制脚本的工具,然后,另外想办法.性能测试实际上就是对服务器的承载能力的测试,和各种类型的手机客户端没有啥多大关系,手机再好,服务器负载不了,也不能够 ...
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
原文链接: http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html 代码: http://files.cnblogs.com/k ...
- TTMS 一个基于Java Swing的Socket通信的剧院票务管理系统
TTMS (Theater Ticket Management System) 点我进入github TTMS全称剧院票务管理系统,分为客户端和服务器端.服务器端可以接收客户端连接请求,客户端相当于我 ...
- Android Studio NDK JNI动态注册本地方法
概述 可能大家觉得javah生成的函数名又臭又长,不太好看.这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来. 实现 这里通过JNIEnv的Resisterna ...
- Java网络编程Socket通信
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 UDP (User Datagram Proto ...
- C++/java之间的Socket通信大小端注意事项
在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...
- JAVA TCP/IP Socket通信机制以及应用
关于局域网通信(同一wifi下,自己电脑当服务端,同一网络段) 1.例如192.168.1.x,只有x位不相同视为同一网络段 2.当具备了以上条件,即可编写服务端代码,服务端的机制. 3.Server ...
- [转]C服务端与java客户端的socket通信注意事项
http://blog.csdn.net/gaoxin1076/article/details/7671752 Socket网络通讯开发总结之:Java 与 C进行Socket通讯 注意以下问题: 1 ...
随机推荐
- HDU 1171 Big Event in HDU (多重背包变形)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- MP2359 1.2A, 24V, 1.4MHz Step-Down Converter in a TSOT23-6
The MP2359 is a monolithic step-down switch mode converter with a built-in power MOSFET.It achieves ...
- redis主键失效机制
Memcached删除主键的方式与Redis有何异同 首先,Memcached 在删除失效主键时也是采用的消极方法,即 Memcached 内部也不会监视主键是否失效,而是在通过 Get 访问主键时才 ...
- Visual Studio 2012连接TFS2010登录不了
一直用VS2012+TFS2010开发项目, 最近几天忽然很不正常, 在VS中会频繁要求输入TFS的账号密码, 经常要输入很多遍才可以正常连接签入签出. 这几天更甚, 基本上直接连接不了了. 网上找到 ...
- OpenCV学习(11) 图像的腐蚀与膨胀(2)
先对一副灰度图像进行腐蚀操作,然后在腐蚀后的图像上再进行膨胀操作,我们定义这个操作为开操作. 先对一副图像进行膨胀操作,然后在膨胀后的图像上再进行腐蚀操作,我们定义这个操作为闭操作. 开操 ...
- sqlmap的篡改绕过WAF
space2comment.py Replaces space character (‘ ‘) with comments ‘/**/’ Example: * Input: SELECT id FRO ...
- Ubuntu下中文完美解决方案
目标:英文环境下,实现中文的输入和完美显示,解决了粗体和斜体 创新点:解决了英文的锯齿问题 不足之处:某些数字还有锯齿现象 主要参考文章: 修改ttf字体美化显示效果 by cnhnln@linuxf ...
- Linux 网络设备驱动开发(一) —— linux内核网络分层结构
Preface Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计. Linux内核采用分层结构处理网络数据包.分层结构与网络协议的结构匹配,既能简化数据包处理流程,又 ...
- python爬虫——利用BeautifulSoup4爬取糗事百科的段子
import requests from bs4 import BeautifulSoup as bs #获取单个页面的源代码网页 def gethtml(pagenum): url = 'http: ...
- Node.js:常用工具、路由
一.常用工具util util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. 1.util.inherits util.inherit ...