1 简介
nanomsg是一个socket library,它提供了几种常见的通信模式,为了能使网络层快速、可扩展并且能易于使用。c版本的zeromq(c++)。
官方地址
github
文档地址
2 java版本环境构建
nanomsg的java库有两个 jnano和jnanomsg,其中jnano比较早的库,现在应该不维护了,jnanomsg支持Clojure and Java 。文档地址。
2.1 系统相关
window10,idea,通过 maven进行构建。
2.2 pom.xml配置
<!--project->repositories标签增加()-->
<repository>
<id>clojars.org</id>
<url>http://clojars.org/repo</url>
</repository>
<!--project->dependencies标签增加-->
<dependency>
<groupId>jnanomsg</groupId>
<artifactId>jnanomsg</artifactId>
<version>0.4.3</version>
</dependency>
2.3 安装cmake
因为jnanomsg需要依赖nanomsg,所以需要编译c的环境了。先下载个cmake window版本下载页面 可以选msi一路下一步进行安装)。
2.4 下载nanomsg代码
git clone https://github.com/nanomsg/nanomsg.git
2.5 使用cmake编译
01
image.png
注意这里的vs选择,如果你的jdk是64,则需要选的vs版本也得是64,默认对应的是32位。
image.png
选择完成后点击finish,如果选择的vs版本本地没有安装就会报错。
image.png
清除bin目录下的所有文件,重新打开cmake, 再重新走前三步重新编译。遇到如下可以直接忽略,点击generate
image.png
如果正常则可以在bin目录下找到nanomsg.sln,直接使用vs打开就可以了。
image.png
导航栏->生成->生成 ALL_BUILD。生成成功后可以在bin下的Release目录下可以看到(如果选的debug则在debug目录)nanomsg.lib和nanomsg.dll。
2.6 copy dll
接下来就是怎么把dll和lib让项目引用到了。通过下面的错误可以去查找jna相关的资料。有说放在当前运行java目录下,也有说c:/window32的,但是都不行 。再看了看报错(也就是not found in resource path后面的一大堆路径),发现可以放在项目->tagrget->classes下。就copy dll到该目录下
// 如果dll放的目录不对的话就会出现下面的错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'nanomsg': Native library (win32-x86-64/nanomsg.dll) not found in resource path(....)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:277)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403)
at com.sun.jna.Native.register(Native.java:1529)
at com.sun.jna.Native.register(Native.java:1252)
at nanomsg.NativeLibrary.<clinit>(NativeLibrary.java:30)
at nanomsg.Nanomsg.getSymbols(Nanomsg.java:35)
at nanomsg.Nanomsg.<clinit>(Nanomsg.java:48)
at nanomsg.Nanomsg$constants.<clinit>(Nanomsg.java:51)
at nanomsg.reqrep.RepSocket.<init>(RepSocket.java:13)
at nano.Rep.main(Rep.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
再次运行,还是报错,请检查cmake时候选择的平台是否和jdk是一个平台。我就是因为jdk为x6464,选的vs为visual studio 14 2015(其实为x86平台 )。删除项目重新cmake。在打开项目 默认就是x64了,再生成 ALL_BUILD就可以了。
Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
at com.sun.jna.Native.open(Native Method)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:263)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403)
at com.sun.jna.Native.register(Native.java:1529)
at com.sun.jna.Native.register(Native.java:1252)
at nanomsg.NativeLibrary.<clinit>(NativeLibrary.java:30)
at nanomsg.Nanomsg.getSymbols(Nanomsg.java:35)
at nanomsg.Nanomsg.<clinit>(Nanomsg.java:48)
at nanomsg.Nanomsg$constants.<clinit>(Nanomsg.java:51)
at nanomsg.reqrep.RepSocket.<init>(RepSocket.java:13)
at nano.Rep.main(Rep.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
2.7 测试代码
package nano;
import nanomsg.reqrep.RepSocket;
/**
* Created by wenshao on 2018/3/25.
*/
public class Rep {
public static void main(String[] args) {
RepSocket sock = new RepSocket();
sock.bind("tcp://*:6789");
sock.setRecvTimeout(10000);
while (true) {
byte[] receivedData = sock.recvBytes();
sock.send(receivedData);
}
}
}
网友评论