java+nanomsg(jnanomsg)
应用概述:
公司原本业务是服务端通过mqtt下发指令给相机端执行,现有需求将相机捕捉的一些图片或者 视频发送给服务端,然后服务端进行相应的存储。由于原本架构用的emqx(mqtt broker)适用于一些短的topic发送,视频和照片太大,所以就用到了nanomsg。当然我要求的是里面的req,rep模式。
1、依赖引入
与java结合官方文档
<repositories><repository><id>clojars.org</id><url>https://mirrors.ustc.edu.cn/clojars/</url></repository></repositories><!--nng--><dependency><groupId>jnanomsg</groupId><artifactId>jnanomsg</artifactId><version>0.4.3</version></dependency></dependencies>
为何url和官网不同,因为外网真是很慢,依赖加不进去,只能用镜像。就像你刚下maven时候配置的阿里云镜像一个道理吧。
2、代码
官网demo可能太老,我根本跑不起来。还是从网上找的demo。
/*** @author mlcheng* @date 2022/10/17 11:13*/
public class ReqRep {private static String url = "tcp://192.168.1.106:7789";public static void main(String[] args) {reply();request();}private static void request() {final ReqSocket socket = new ReqSocket();socket.connect(url);new Thread(new Runnable() {public void run() {while (true) {try {socket.send("request");Thread.sleep(1000);System.out.println( socket.recvString());} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}).start();}private static void reply() {final RepSocket socket = new RepSocket();socket.bind(url);new Thread(new Runnable() {public void run() {while (true) {try {System.out.println(socket.recv());Thread.sleep(1000);socket.send("reply");System.out.println("----send已经发送");} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}
}
这是打通的样子,但其实还少东西,你运行起来还是报错。
3、加入library
这是报错信息,还需要library nanomsg
原因:我也迷迷糊,大概意思人家是c语言写的,你java要用当然不能直接用了。
引用大佬讲解:nanomsg的使用,需要针对不同的平台编译并得到动态库,然后引入项目。当前自己在window10-x86-64 和 linux-x86-64的环境下编译了两个动态库。(本次使用的是nanomsg5.1.0)
windows:直接将nanomsg.dll和nanomsg.lib置于类路径下
linux:在类路径下创建目录 linux-x86-64,并将libnanomsg.so文件放入其下
编译(cmake,vs捣鼓捣鼓才行,java上哪会去)出来太麻烦还是用大佬的连接:获取dll,lib
4、完善
上面三步骤后,基本上就打通了,但是测试的时候reply端接收request发送的消息的字节长度有限制,需要进行改进,毕竟20兆的视频可是1024x1024x20=20971520 个字节
网上关于nanomsg和java的东西太少了,对于我这样菜鸟来说,太难了,只找到官网上零星一点点
零星一点点
反正最重要的一个就是nn_setsockopt方法,但是java中的nn_setsockopt方法。。。。没有这个rcvmaxsize
跟领导讨论一番后,他居然说你照葫芦画瓢写个带NN_RCVMAXSIZE的setSockopt的方法,我只能深情的说了句这是底层源码。
解决: 还是得是网上找,果然在github上找到了一个大佬重写了一些底层,然后还有这个方法。
附上连接:github地址
private static void reply() {Charset charset = StandardCharsets.UTF_8;final RepSocket socket = new RepSocket();socket.bind(url);//20971520socket.setSocketOpt(Nanomsg.SocketOption.NN_RCVMAXSIZE,42971520);new Thread(new Runnable() {public void run() {while (true) {try {// String a = socket.recvString();
// System.out.println("-----------长度"+a.length());System.out.println(charset.decode(socket.recv()).toString());Thread.sleep(1000);socket.send("reply");System.out.println("----send已经发送");} catch (IOException e) { e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}
完美,我设置的是40多兆也能接收到request发送的消息了。
java+nanomsg(jnanomsg)相关推荐
- java入门(p1)进入java的世界
浅谈java世界(连载中P1) Java是一门语言,它并不是很难理解的东西,语言是来进行交流的工具,那么它用来跟谁来交互呢,所有的语言都有与其交流的对象,中文也好英文也罢,交流基本的对象应该有人对吧, ...
- 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)
用 XStream 序列化/反序列化 XML 为 Java 对象(实例) Posted on 2007-06-05 19:06 Stephen Wong 阅读(1224) 评论(0) 编辑 收藏 网 ...
- Java虚拟机(JVM)
Java虚拟机(JVM)是能够让计算机运行Java程序的虚拟且可以计算运作的机器.JVM有三个概念:规范文档.实现和实例.规范文档是规范地说明Java虚拟机必须有哪些实现的文档.单一的规范文档保证了所 ...
- Java模式(适配器模式)
今天看了下Java中的适配器模式,以下就来小做下总结和谈谈感想,以便日后使用. 首先,先来先讲讲适配器.适配就是由"源"到"目标"的适配,而当中链接两者的关系就 ...
- Java总结篇系列:Java多线程(二)
本文承接上一篇文章<Java总结篇系列:Java多线程(一)>. 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型.下面分别看下引起Java线程阻塞的主要方法 ...
- Java 多线程(七) 线程间的通信
Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...
- getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)
作者:CHAITANYA SINGH 来源:通过示例学习Java编程(14):Java中的构造函数-方家话题 构造函数是用来初始化新创建的对象的代码块.构造函数类似于java中的实例方法(Instan ...
- Java EE(五)
一.Applet Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程序. ...
- JAVA 总结(壹)
Java总结(壹) 第一章 认识Java (1)Java发展史 (2)Java语言特点:简洁有效:可移植性:面对对象:解释型:适合分布式计算:拥有较好的性能:健壮,防患于未然:具有多线程处理能力:具 ...
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
最新文章
- Windows下VS2013 C++编译测试faster-rcnn
- 手持终端可以根据行业的功能要求进行定制
- Linux基础命令---检查密码文件pwck
- [转载] Golang-简洁的并发
- 数据库事物 jdbc事物 spring事物 隔离级别:脏幻不可重复读
- Hadoop学习笔记(二):MapReduce的进度和状态
- 用友漏洞php,用友NC任意文件上传漏洞复现
- R语言如何下载及安装?——R语言安装及环境配置1
- html 倒计时弹出框,alert警告框倒计时
- [转]overflow解决float浮动后高度自适应问题
- 服务器机房监控系统,服务器机房监控建设方案的介绍
- Graphene图数据建模工具
- 家庭网络访问另一台计算机没权限,访问局域网电脑提示没有权限怎么办
- GeoServer中使用SLD样式
- 蓝色理想的flex教材不能在flex Development做不能使用,我整理一下供初学者参考
- 群晖Docker青龙面板部署方法V2.11.0
- 2020考研数学一考研大纲原文
- 正则表达式JS-1212
- 如何快速解决Unity中万向节死锁(gimbal lock)的问题
- android 64位系统中,需要引用32位库,导致挂掉的问题