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: ...
随机推荐
- fcc筆記
在 JavaScript 中所有的变量都是大小写敏感的JavaScript提供七种不同的data types(数据类型),它们是undefined(未定义), null(空), boolean(布尔型 ...
- 计算机基础(day02)
目录 什么是编程? 计算机的组成 CPU(大脑) 控制器 运算器 存储器 主存 外存 IO设备 input设备(输入设备) output设备(输出设备) 多核cpu 32位和64位 机械硬盘工作原理 ...
- Nopi 导出设置行高
1.导出excel行显示不完整数据客户不满意,需要我们处理 ; rowNum <= sheet.LastRowNum; rowNum++) { HSSFRow currentRow = shee ...
- 二、Python安装和第一个程序
<1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...
- Python爬虫笔记【一】模拟用户访问之设置处理cookie(2)
学习的课本为<python网络数据采集>,大部分代码来此此书. 做完请求头的处理,cookie的值也是区分用户和机器的一个方式.所以也要处理一下cookie,需要用requests模块,废 ...
- Linux Shell脚本经典案例
开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的,在函数中变量 ...
- iOS学习笔记-084.粒子效果——路径移动
https://blog.csdn.net/qiwenmingshiwo/article/details/75806637 粒子效果路径移动一说明1 效果2 步骤分析二代码1 VCViewh2 VCV ...
- Leetcode561.Array Partition I数组拆分1
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...
- 开发者说 | 分布式事务中间件 Seata 的设计原理
导读 微服务架构体系下,我们可以按照业务模块分层设计,单独部署,减轻了服务部署压力,也解耦了业务的耦合,避免了应用逐渐变成一个庞然怪物,从而可以轻松扩展,在某些服务出现故障时也不会影响其它服务的正常运 ...
- 【html、CSS、javascript-13】前端框架Bootstrap
1.Bootstrap前端框架:包含css样式.js插件.图标等 http://www.bootcss.com/ 2.Font Awesome:非常全的图标大全 https://fontawesome ...