Server  -  JAVA

package com.jim.ndkdemo;

import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; class ServerSocketThread extends Thread
{
public static String TAG = "zjm";
private boolean keepRunning = true;
private LocalServerSocket serverSocket; private void readMsg(LocalSocket interactClientSocket) {
StringBuilder recvStrBuilder = new StringBuilder();
InputStream inputStream = null;
try
{
inputStream = interactClientSocket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
char[] buf = new char[4096];
int readBytes = -1;
while ((readBytes = inputStreamReader.read(buf)) != -1) {
String tempStr = new String(buf, 0, readBytes);
recvStrBuilder.append(tempStr);
}
Log.d(TAG, "Receive MSG: " + recvStrBuilder.toString());
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, "resolve data error !");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} @Override
public void run()
{
try {
serverSocket = new LocalServerSocket("pym_local_socket");
} catch (IOException e) {
e.printStackTrace();
keepRunning = false;
}
while(keepRunning)
{
Log.d(TAG, "wait for new client coming !");
try {
LocalSocket interactClientSocket = serverSocket.accept();
//由于accept()在阻塞时,可能Activity已经finish掉了,所以再次检查keepRunning
if (keepRunning) {
Log.d(TAG, "new client coming !");
readMsg(interactClientSocket);
}
} catch (IOException e) {
e.printStackTrace();
keepRunning = false;
}
} if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} public class MainActivity extends AppCompatActivity { public static String TAG = "zjm";
private ServerSocketThread socketThread;
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); socketThread = new ServerSocketThread();
socketThread.setName("zjmserver");
socketThread.start(); try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} // Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI()); } /**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}

Client - C++

#include <jni.h>
#include <string>
#include <android/log.h> #include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h> #define ANDROID_SOCKET_NAMESPACE_ABSTRACT 0 #define NO_ERR 0
#define CREATE_ERR -1
#define CONNECT_ERR -2
#define LINUX_MAKE_ADDRUN_ERROR -3
#define CLOSE_ERR -5 #define LOG_TAG "zjm"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) /* 构造sockaddr_un */
int socket_make_sockaddr_un(const char *name, int namespaceId, struct sockaddr_un *p_addr, socklen_t *socklen)
{
size_t namelen; memset(p_addr, 0x00, sizeof(*p_addr));
namelen = strlen(name); // Test with length +1 for the *initial* '\0'.
if ((namelen + ) > sizeof(p_addr->sun_path)) {
return LINUX_MAKE_ADDRUN_ERROR;
}
p_addr->sun_path[] = ;
memcpy(p_addr->sun_path + , name, namelen); p_addr->sun_family = AF_LOCAL;
*socklen = namelen + offsetof(struct sockaddr_un, sun_path) + ; return NO_ERR;
} /* 连接到相应的fileDescriptor上 */
int socket_local_client_connect(int fd, const char *name, int namespaceId, int type)
{
struct sockaddr_un addr;
socklen_t socklen;
//size_t namelen;
int ret;
ret = socket_make_sockaddr_un(name, namespaceId, &addr, &socklen);
if (ret < ) {
return ret;
} if(connect(fd, (struct sockaddr *) &addr, socklen) < ) {
return CONNECT_ERR;
} return fd;
} /* 创建本地socket客户端 */
int socket_local_client(const char *name, int namespaceId, int type)
{
int socketID;
int ret; socketID = socket(AF_LOCAL, type, );
if(socketID < ) {
return CREATE_ERR;
} ret = socket_local_client_connect(socketID, name, namespaceId, type);
if (ret < ) {
close(socketID);
return ret;
} return socketID;
} int SendMsgBySocket() {
int socketID;
struct sockaddr_un serverAddr;
char path[] = "pym_local_socket\0";
int ret; socketID = socket_local_client(path, ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
if (socketID < ) {
return socketID;
}
//Send Msg
char buf[] = "hello";
ret = write(socketID, buf, strlen(buf)); ret = close(socketID);
if (ret < ) {
return CLOSE_ERR;
} return NO_ERR;
} extern "C"
JNIEXPORT jstring JNICALL
Java_com_jim_ndkdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++"; int pid = fork();
if (pid == ) {
//sub process
setpgid(, );
int ret = SendMsgBySocket();
LOGI("ret = %d", ret);
} else if (pid > ) {
//int ret = SendMsgBySocket();
//LOGI("ret = %d", ret);
} else {
LOGI("pid < 0");
} sleep(); return env->NewStringUTF(hello.c_str());
}

socket in android的更多相关文章

  1. Socket for android 简单实例

    最近在实现socket通信,所以写个demo来简单实现下.我用了一种是原始的socket实现,另一种是MINA框架来实现的. 下载demo:http://download.csdn.net/detai ...

  2. 非堵塞socket实现android手机与PC的文件传输

    项目须要是通过WIFI建立手机和PC的通信,然后自己定义一个简单的协议对要传输的文件进行校验,传输的文件是2张3M的图片,要求考虑网络中断情况处理. 我这里採用的是非堵塞socket来实现的,之前查过 ...

  3. 基于Socket的Android手机视频实时传输

    首先,简单介绍一下原理.主要是在手机客户端 (Android)通过实现Camera.PreviewCallback接口,在其onPreviewFrame重载函数里面获取摄像头当前图像数据, 然后通过S ...

  4. android socket 线程连接openwrt与arduino单片机串口双向通信

    package zcd.netanything; import java.io.BufferedReader; import java.io.InputStreamReader; import jav ...

  5. Socket实现粗略的Android聊天功能

    面试时写过,但是很乱,今天看到代码库里有一个,还是很规范的,贴出来. 主要用到俩类,一个是ServerSocket.class 一个是Socket.class. 记得要加权限:  <uses-p ...

  6. Android进程间通信之socket通信

    用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...

  7. 一个Android Socket的例子

    1.开篇简介 Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类).要实现Socket的传输,需要构建客户端和服务器端.另外,传输的数据可以是字符 ...

  8. Android网络编程之Socket

    Socket(套接字)是一种通信机制,可以实现单机或跨网络进行通信,其创建需要明确的区分C(客户端)/S(服务器端),支持多个客户端连接到同一个服务器.有两种传输模式: 1).面向连接的传输:基于TC ...

  9. Android Socket通信

    1.TCP: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

随机推荐

  1. Lua程序设计之数值

    (摘自Lua程序设计) 数值常量 从Lua5.3版本开始Lua语言为数值格式提供了两种选择:被称为integer的64位整形和被称为float的双精度浮点类型(注意,"float" ...

  2. Python 编码转换与中文处理

    python 中的 unicode是让人很困惑.比较难以理解的问题. 这篇文章 写的比较好,utf-8是 unicode的一种实现方式,unicode.gbk.gb2312是编码字符集. py文件中的 ...

  3. Django项目:CRM(客户关系管理系统)--83--73PerfectCRM实现CRM模板统一

    {#king_index.html#} {## ————————73PerfectCRM实现CRM模板统一————————#} {% extends "master/sample.html& ...

  4. linux负载均衡(什么是负载均衡)

    linux负载均衡(什么是负载均衡) 一.总结 一句话总结: 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用 ...

  5. 使用C#反射实现用户控件调用父页面方法

    using System.Reflection; MethodInfo mi = this.Page.GetType().GetMethod("GetUserName"); //该 ...

  6. fork 与 vfork

    fork 函数复制父进程(包括父进程的地址空间)产生子进程 在父进程返回子进程ID,在子进程本身返回0. fork一般有两个用处: 1.网络服务进程等待请求,新请求到来,fork一个子进程处理,父进程 ...

  7. Leetcode142. Linked List Cycle II环形链表2

    给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶: 你是否可以不用额外空间解决此题? 方法一:使用map 方法二: 分两个步骤,首先通 ...

  8. SSM-5zookeeper在LINUX上自启

    把zookeeper做成服务 1.进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本 [root@zookeeper ~]# cd /etc/rc.d/init.d/ [ro ...

  9. HDU 3714

    最大值最小问题,三分....竟然排第六当时..... #include<stdio.h> #include<string.h> #define max 10000+10 #de ...

  10. ngVerify - 更高效的 angular 表单验证

    ngVerify v1.5.0 a easy Angular Form Validation plugin.简洁高效的__angular表单验证插件__ See how powerful it.看看它 ...