socket in android
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的更多相关文章
- Socket for android 简单实例
最近在实现socket通信,所以写个demo来简单实现下.我用了一种是原始的socket实现,另一种是MINA框架来实现的. 下载demo:http://download.csdn.net/detai ...
- 非堵塞socket实现android手机与PC的文件传输
项目须要是通过WIFI建立手机和PC的通信,然后自己定义一个简单的协议对要传输的文件进行校验,传输的文件是2张3M的图片,要求考虑网络中断情况处理. 我这里採用的是非堵塞socket来实现的,之前查过 ...
- 基于Socket的Android手机视频实时传输
首先,简单介绍一下原理.主要是在手机客户端 (Android)通过实现Camera.PreviewCallback接口,在其onPreviewFrame重载函数里面获取摄像头当前图像数据, 然后通过S ...
- android socket 线程连接openwrt与arduino单片机串口双向通信
package zcd.netanything; import java.io.BufferedReader; import java.io.InputStreamReader; import jav ...
- Socket实现粗略的Android聊天功能
面试时写过,但是很乱,今天看到代码库里有一个,还是很规范的,贴出来. 主要用到俩类,一个是ServerSocket.class 一个是Socket.class. 记得要加权限: <uses-p ...
- Android进程间通信之socket通信
用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...
- 一个Android Socket的例子
1.开篇简介 Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类).要实现Socket的传输,需要构建客户端和服务器端.另外,传输的数据可以是字符 ...
- Android网络编程之Socket
Socket(套接字)是一种通信机制,可以实现单机或跨网络进行通信,其创建需要明确的区分C(客户端)/S(服务器端),支持多个客户端连接到同一个服务器.有两种传输模式: 1).面向连接的传输:基于TC ...
- Android Socket通信
1.TCP: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
随机推荐
- Redis高可用及集群
目录 Redis主从复制 环境准备 主从复制命令 Redis Sentinel 功能 Redis Sentinel配置 Redis集群 Redis主从复制 使用异步复制 一个服务器可以有多个从服务器 ...
- day19 作业
今日作业 1.什么是对象?什么是类? 对象:特征和技能的结合体 类:一系列对象 相同的特征和技能的结合体 2.绑定方法的有什么特点 对象调用类内部的函数 称之为绑定方法,特点: 不同的对象调用该绑定方 ...
- Beyond Compare注册码
注册码: --- BEGIN LICENSE KEY --- H1bJTd2SauPv5Garuaq0Ig43uqq5NJOEw94wxdZTpU-pFB9GmyPk677gJ vC1Ro6sbAvK ...
- Shell 语法之用户输入
bash shell 提供了一些不同的方法从用户处获取数据,这些方法包括命令行参数.命令行选项和直接读取键盘输入. 命令行参数 bash shell 将在命令行中输入的所有参数赋值给一些特殊变量,称为 ...
- node.js 安装步骤
1.打开链接(http://nodejs.cn/download/) 2.下载自己所需的安装包(32位 or 64位.哪个系统) 3.双击直接安装(成功如下图) 4.点击 Node.js comman ...
- Python学习 备注(2)
由于python下许多框架都是在python2下的,python3向下不兼容 需安装python2 安装好后,使用pip安装python下的框架scrapy 总是报错,最后发现是包管理器,pip的版本 ...
- Hibernate-一对多|多对一-多对多
1 一对多|多对一 1.1 关系表达 表中的表达 表中的表达 实体中的表达 orm元数据中表达 一对多 多对一 1.2 操作 操作关联属性 1.3 进阶操作 级联操作 结论: 简化操作.一定要用,s ...
- 操作系统实验 windows编程多线程 生产者消费者问题 画圆画方(内置bug版)
实验3:随便写的 #include <windows.h> #include <string> #include <stdio.h> #pragma warning ...
- Eclipse:Eclipse所有发布版本的下载地址
官方镜像:http://eclipse.mirror.rafal.ca/technology/epp/downloads/release/ 国内镜像:http://mirrors.neusoft.ed ...
- 关于node中 require 和 ES6中export 、export default的总结
nodejs中 require 方法的加载规则 方法的加载规则 1. 优先从缓存中加载 2. 核心模块 3. 路径形式的模块 4. 第三方模块 一.优先从缓存中加载 main.js:执行加载a.js模 ...