# VNanoMsg
**Repository Path**: Vaccae/VNanoMsg
## Basic Information
- **Project Name**: VNanoMsg
- **Description**: Android下的NanoMsg,仿NNanoMsg
- **Primary Language**: Kotlin
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 1
- **Created**: 2020-12-15
- **Last Updated**: 2025-08-29
## Categories & Tags
**Categories**: android-modules
**Tags**: None
## README
# VNanoMsg
**Android下的Socket通讯库,对NanoMsg的二次封装,仿照NNanoMsg的第三方开源库**
## 公众号:微卡智享
[详细的介绍说明](http://mp.weixin.qq.com/mp/homepage?__biz=MzA4Nzk0NTU0Nw==&hid=6&sn=9c965c60c6d80e0e8c60ca627225cdb2&scene=18#wechat_redirect)
## 使用方法
### 添加依赖项
##### 在build.gradle中加入VNanoMsg的引用
``` kotlin
android {
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
}
dependencies {
implementation 'com.github.Vaccae:VNanoMsg:1.0.4'
}
```
#### 核心函数
##### 创建对应的通讯模式
``` kotlin
//PAIR通讯模式
var nn = NNPAIR()
//BUS通讯模式
var nn = NNBUS()
//REQREP模式
var nn = NNREQREP()
//PUBSUB模式
var nn = NNPUBSUB()
//SURVEY模式
var nn = NNSURVEY()
//PipeLine中的Push模式
var nn - NNPIPEPUSH()
//PipeLine中的Pull模式
var nn - NNPIPEPULL()
```
##### 绑定地址(服务端)
``` kotlin
//绑定地址 地址要写全如上 tcp://加地址
//返回是 bool ture是成功 false是失败
var res = nn.bind("tcp://*:8080")
```
##### 连接服务端
``` kotlin
//连接服务端 地址要写全如上 tcp://加地址
//返回是 bool ture是成功 false是失败
var res = nn.connect("tcp://localhost:8080")
```
##### 发送数据
``` kotlin
//发送数据 String
//返回值:发送的字节数 Int
var res = nn.send("你好")
//发送数据 ByteArray
//返回值:发送的字节数
val msg = "你好"
val bytes = msg.toByteArray()
var res = nn.send(bytes)
```
##### 接收数据
``` kotlin
//接慢数据
//返回值:接收到字符串 String
var res = nn.recv()
//接收数据
//返回值:接收的数据 ByteArray
var res = nn.recvbyte()
val msg = res.toString(charset = Charsets.UTF_8)
```
##### 设置/取消订阅前缀
==订阅消息只针对PUBSUB模式才有的参数==
``` kotlin
//设置订阅前缀
//返回值:大于0成功,小于0失败 Int
var res = nn.subscribe("输入要订阅的主题字符串")
//取消订阅前缀
//返回值:大于0成功,小于0失败 Int
var res = nn.unsubscribe("输入要取消订阅的主题字符串")
```
### 特别说明
==执行连接、发送、接收数据时需要加上try catch防止程序崩溃,因为在NDK中接收失败或是发送失败时我都会直接抛出异常来
==
``` kotlin
try {
//发送数据
it?.send(edtinput.text.toString())
//延时50毫秒
Thread.sleep(50)
//接收数据
val recvmsg = it?.recv()
tvmsg.append(recvmsg + "\r\n")
} catch (e: IllegalArgumentException) {
tvmsg.append(e.message.toString() + "\r\n")
}
```
### 简单例子
##### 这里用的是REQREP的模式,别的模式就是在创建时设置对应的类即可。
``` kotlin
class REQREPActivity : AppCompatActivity() {
private var nnreqrep: NNREQREP? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_reqrep)
//连接按钮
btnConnent.setOnClickListener {
if (nnreqrep == null) {
nnreqrep = NNREQREP()
}
nnreqrep.let {
try {
if (it?.connect(edtipadr.text.toString())!!) {
tvmsg.append("REQREP连接成功!\r\n")
} else {
tvmsg.append("REQREP连接失败!\r\n")
}
} catch (e: IllegalArgumentException) {
tvmsg.append(e.message.toString() + "\r\n")
}
}
}
//发送按钮
btnSend.setOnClickListener {
nnreqrep.let {
try {
val input = edtinput.text.toString()
val bytes = input.toByteArray()
//发送数据
it?.send(bytes)
//延时50毫秒
Thread.sleep(50)
//接收数据
val recvbyte = it?.recvbyte()
val recvmsg = recvbyte?.toString(charset = Charsets.UTF_8)
tvmsg.append(recvmsg + "\r\n")
} catch (e: IllegalArgumentException) {
tvmsg.append(e.message.toString() + "\r\n")
}
}
}
}
}
```
## 版本更新记录
### 1.0.4版本
加入了nn.shundownbind()和nn.shundownconnect()两个函数,用于从套接字中删除端点。
### 1.0.3版本
修复了nn.close()中总是提示关闭套接字失败的问题。
### 1.0.2版本
1.把Nanomsg中原来改的SurVey的参数改了回来,用于解决通讯时接收不全的问题。
2.SurVey例子中原来接收后开启的线程,改为了kotlin的协程方式,对协程的一个简单的学习。
### 1.0.1版本
1. JNI层的重新封装,新增加了一个NNBaseInf的接口,别的模块调用时都是引用它来实现,减少了很多不必要的代码。
2. 增加了NNPIPEPULL和NNPIPEPUSH两个通讯类,主要是针对PIPELINE的通讯模式。
3. C++中加入了通过JNI里用JAVA的方式把char指针转换为UTF-8,防止因为乱字符的问题导航NewStringUTF的函数出错,程序崩溃,并且把相关的工具类改放到utils的类中,不是都写在了native-lib.cpp了。
4. recv的接收函数里重新修改了一下截取的方式,防止出现接收数据时随机增加了字符BUG。