应用概述:
公司原本业务是服务端通过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)相关推荐

  1. java入门(p1)进入java的世界

    浅谈java世界(连载中P1) Java是一门语言,它并不是很难理解的东西,语言是来进行交流的工具,那么它用来跟谁来交互呢,所有的语言都有与其交流的对象,中文也好英文也罢,交流基本的对象应该有人对吧, ...

  2. 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)

    用 XStream 序列化/反序列化 XML 为 Java 对象(实例) Posted on 2007-06-05 19:06 Stephen Wong 阅读(1224) 评论(0)  编辑 收藏 网 ...

  3. Java虚拟机(JVM)

    Java虚拟机(JVM)是能够让计算机运行Java程序的虚拟且可以计算运作的机器.JVM有三个概念:规范文档.实现和实例.规范文档是规范地说明Java虚拟机必须有哪些实现的文档.单一的规范文档保证了所 ...

  4. Java模式(适配器模式)

    今天看了下Java中的适配器模式,以下就来小做下总结和谈谈感想,以便日后使用. 首先,先来先讲讲适配器.适配就是由"源"到"目标"的适配,而当中链接两者的关系就 ...

  5. Java总结篇系列:Java多线程(二)

    本文承接上一篇文章<Java总结篇系列:Java多线程(一)>. 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型.下面分别看下引起Java线程阻塞的主要方法 ...

  6. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  7. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)

    作者:CHAITANYA SINGH 来源:通过示例学习Java编程(14):Java中的构造函数-方家话题 构造函数是用来初始化新创建的对象的代码块.构造函数类似于java中的实例方法(Instan ...

  8. Java EE(五)

    一.Applet Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程序. ...

  9. JAVA 总结(壹)

    Java总结(壹) 第一章  认识Java (1)Java发展史 (2)Java语言特点:简洁有效:可移植性:面对对象:解释型:适合分布式计算:拥有较好的性能:健壮,防患于未然:具有多线程处理能力:具 ...

  10. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

最新文章

  1. Windows下VS2013 C++编译测试faster-rcnn
  2. 手持终端可以根据行业的功能要求进行定制
  3. Linux基础命令---检查密码文件pwck
  4. [转载] Golang-简洁的并发
  5. 数据库事物 jdbc事物 spring事物 隔离级别:脏幻不可重复读
  6. Hadoop学习笔记(二):MapReduce的进度和状态
  7. 用友漏洞php,用友NC任意文件上传漏洞复现
  8. R语言如何下载及安装?——R语言安装及环境配置1
  9. html 倒计时弹出框,alert警告框倒计时
  10. [转]overflow解决float浮动后高度自适应问题
  11. 服务器机房监控系统,服务器机房监控建设方案的介绍
  12. Graphene图数据建模工具
  13. 家庭网络访问另一台计算机没权限,访问局域网电脑提示没有权限怎么办
  14. GeoServer中使用SLD样式
  15. 蓝色理想的flex教材不能在flex Development做不能使用,我整理一下供初学者参考
  16. 群晖Docker青龙面板部署方法V2.11.0
  17. 2020考研数学一考研大纲原文
  18. 正则表达式JS-1212
  19. 如何快速解决Unity中万向节死锁(gimbal lock)的问题
  20. android 64位系统中,需要引用32位库,导致挂掉的问题

热门文章

  1. meterpreter下抓取windows系统明文密码实验
  2. 推荐一款开源的加解密算法 --- XXTEA
  3. 腾讯通rtx中心服务器,腾讯通(RTX)详细使用教程
  4. 安装Server2003+SQL2000+SQL2000SP4
  5. 传染病模型(4)——SIRS模型和SIER模型及matlab具体程序
  6. linux开发板挂载
  7. 解读国密非对称加密算法SM2
  8. mui 框架图片预览
  9. t-SNE非线性降维
  10. html双人对战源码,双人对战五子棋游戏 综合运用HTML、CSS、JavaScript实现