VNanoMsg是Android下的Socket通讯库,对NanoMsg的二次封装,仿照NNanoMsg的第三方开源库。
在build.gradle中加入VNanoMsg的引用
android { allprojects { repositories { maven { url 'https://jitpack.io' } } } } dependencies { implementation 'com.github.Vaccae:VNanoMsg:1.0.3' }
创建对应的通讯模式
//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()
绑定地址(服务端)
//绑定地址 地址要写全如上 tcp://加地址 //返回是 bool ture是成功 false是失败 var res = nn.bind("tcp://*:8080")
连接服务端
//连接服务端 地址要写全如上 tcp://加地址 //返回是 bool ture是成功 false是失败 var res = nn.connect("tcp://localhost:8080")
发送数据
//发送数据 String //返回值:发送的字节数 Int var res = nn.send("你好") //发送数据 ByteArray //返回值:发送的字节数 val msg = "你好" val bytes = msg.toByteArray() var res = nn.send(bytes)
接收数据
//接慢数据 //返回值:接收到字符串 String var res = nn.recv() //接收数据 //返回值:接收的数据 ByteArray var res = nn.recvbyte() val msg = res.toString(charset = Charsets.UTF_8)
设置/取消订阅前缀
==订阅消息只针对PUBSUB模式才有的参数==
//设置订阅前缀 //返回值:大于0成功,小于0失败 Int var res = nn.subscribe("输入要订阅的主题字符串") //取消订阅前缀 //返回值:大于0成功,小于0失败 Int var res = nn.unsubscribe("输入要取消订阅的主题字符串")
==执行连接、发送、接收数据时需要加上try catch防止程序崩溃,因为在NDK中接收失败或是发送失败时我都会直接抛出异常来
==
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的模式,别的模式就是在创建时设置对应的类即可。
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") } } } } }
$config = [ 'corp_id' => 'xxxxxxxxxxxxxxxxx', 'secret' => 'xxxxxxxxxx', // 通讯录的 secret //... ]; $contacts = Factory::work($config); 成员管理 创建成员 $data = [ "userid" => "overtrue",
SPI通讯 OMAP芯片会使用一个串行外围接口,实现一个适合的协议,与V850芯片通讯。这个通讯包括了刷新V850芯片,执行DTC操作和发送CAN信息。实际上,这个通讯是在一个高级别上,通过各种服务实现的。在低级别上,可以通过读取和写入‘/dev/spi3’来实现直接通讯。 不过,似乎没有命令能让OMAP芯片来要求V850将数据字节发送给任意CAN ID。但是,V850内置了一系列的命令ID,多数
主要内容:GWT RPC通讯 介绍,GWT RPC通讯 组件,GWT RPC通讯 示例GWT RPC通讯 介绍 基于 GWT 的应用程序通常由客户端模块和服务器端模块组成。客户端代码在浏览器中运行,服务器端代码在 Web 服务器中运行。客户端代码必须通过网络发出 HTTP 请求才能访问服务器端数据。 RPC,远程过程调用是 GWT 使用的机制,客户端代码可以在其中直接执行服务器端方法。 GWT RPC 是基于 servlet 的。 GWT RPC 是异步的,客户端在通信过程中永远不
contacts对象提供对设备通讯录数据库的访问。 方法: contacts.create contacts.find 参数: contactFields contactSuccess contactError contactFindOptions 对象: Contact ContactName ContactField ContactAddress ContactOrganization Con
问题内容: 我已经阅读了本网站上的许多文章,了解如何在Android中接收UDP数据包。但是,这些都不对我有用! 一些基本知识: 我正在3G(不是wifi或其他任何设备)上运行的HTC Incredible(Android 2.2)上进行测试。这里没有仿真器。 我的代码很简单: 我的服务器(在我的PC上运行)正在侦听端口8752上的UDP通信。 我的Android应用程序在一个随机端口上打开一个D
该示例为小程序间的页面通讯,利用 vuex 实现。 在 mpvue框架中使用 vuex 与在 vue 中使用是一样的体验。 1.建立相关的目录结构 2.在 src/main.js 中将 store 挂载到 vue 原型下面 Vue.prototype.$store = store; 3.在页面中通过 mapGetters 和 mapMutations 使用 state methods: {
EOSIO智能合约由一组 action 和 type 的定义(definitions)组成.action的定义指定并实现了合约中的行为.type的定义指定了所需的内容及结构.EOSIO的actions主要在基于消息的通讯结构中执行.客户端可以通过发送(推送)信息到nodeos来执行actions.这可以通过使用cleos命令来完成.也可以通过EOSIO的send方法之一来完成(例如:eosio::
为什么使用SpringBoot框架(SpringBoot的优点) 事务失效的场景有哪些 Spring事务是如何实现的 IOC基于什么设计模式 Spring注入的方式有哪些 @Autowrited 和@Resource 注解区别 说说重载重写的定义与区别 操作系统死锁的四个条件 Java是什么传递方式?值传递还有引用传递 如何优化sql 索引失效有哪些 创建线程的方以及区别 UDP和TCP协议的区别