先說一下nanomsg+Java需要做什么:
1、nanomsg的so文件的制作與放置路徑
2、Java代碼引入nanomsg的依賴
3、支持Socket參數的調節(包括ipv4/ipv6的網絡支持)
在我目前的認知范圍內要與一個通訊目標實現數據交互通常有這些方式
1、broker中間人轉發,
例如:kafka,mqtt 等等mq
2、直接連接進行數據交互
例如:tcp,udp
衍生開來就包含了很多http,netty自定義開發,grpc,等等當然也包含了今天的主角nanomsg;
nanomsg官網:https://niwi.nz/jnanomsg/latest/#_introduction
nanomsg用來做什么看看官網對它的介紹,模式挺多的;
我來簡單講一下怎么應用起來并且讓程序跑起來:
一、so文件的制作與放置路徑
git clone https://github.com/nanomsg/nanomsg.git
cd nanomsg
mkdir build
cd build
cmake ..
make
此時,需要將支持我們系統架構的庫文件挪移到對應的文件夾下,以方便底層邏輯的讀取!
此時build文件下的:libnanomsg.so(x86下的)就是我們需要的庫文件了
注意:在什么樣的操作系統下制作出來的就是支持什么系統的文件,比如mac電腦的文件就是:libnanomsg.dylib
對應系統的java+nanomsg的庫文件的讀取路徑大概是:
macOS:/Library/Java/Extensions 或 /Users/你的用戶名/Library/Java/Extensions
Linux:/usr/lib 或 /usr/local/lib
Windows:C:\Windows\System32
但是在我測試過程中發現,java對于庫文件的讀取會有些許變動:
mac真實讀取位置:/Library/Java/Extensions/darwin/libnanomsg.dylib
linux(x86)真實讀取位置:/usr/lib/libnanomsg.so
其它的需要自己測測了
錯誤引流:
Caused by: java.lang.UnsatisfiedLinkError: Unable to load library ‘nanomsg’: Native library (darwin/libnanomsg.dylib) not found in resource path
二、Java代碼引入nanomsg的依賴
maven:(兩個應該都可以的,我用的第一個)
<dependency><groupId>cs</groupId><artifactId>jnanomsg</artifactId><version>0.4.5</version></dependency>
<!-- <dependency>-->
<!-- <groupId>jnanomsg</groupId>-->
<!-- <artifactId>jnanomsg</artifactId>-->
<!-- <version>0.4.3</version>-->
<!-- </dependency>-->
代碼演示:
提一下address的地址支持:
ipv4支持address:
tcp://0.0.0.0:5551
tcp://*:5592
tcp://[::]:5559
ipv6支持address:
tcp://*:5592
tcp://[::]:5559
tcp://[v6某一個網絡端口的地址]:5593
推送數據:
我演示的是pub/sub模式,也可以理解為去broker的mq
一個server可以有一群client進行連接訂閱server的數據
topic底層應該默認使用的是 空格進行組織的數據
即:
topic1 data
topic2 data
topic3 data
private static String address = "tcp://[::]:5557";private Socket socket;public void afterPropertiesSet() throws Exception {try {socket = new PubSocket();socket.setSocketOpt(Nanomsg.SocketOption.NN_IPV4ONLY,0);//支持ipv6&v4socket.bind(address);log.info("NanoMsgRsuMsgServer socket start success.ad:{}", address);} catch (IOException e) {log.error("創建失敗:",e);}}public void publish(String topic, String data) {if (socket == null) {log.warn("nanomsg socket 尚未初始化");}socket.send(topic + " " + data);}
訂閱數據:
public static void main(String[] args) throws InterruptedException {Socket socket = new SubSocket();// 連到遠端地址socket.connect("tcp://127.0.0.1:5557");socket.subscribe("topic1");//訂閱某一類型的數據socket.subscribe("topic2");
socket.subscribe(" ");//訂閱所有while (true) {System.out.println(socket.recvString());}}
測試可用性:
telnet v6/v4地址 端口(可以被用來查看該端口是否可以被使用/服務是否啟動)
lsof v6/v4地址:端口(可以來看端口啟動的基本信息)
三、支持Socket參數的調節(包括ipv4/ipv6的網絡支持)
沒有設置這個的話,會爆錯誤:
socket.setSocketOpt(Nanomsg.SocketOption.NN_IPV4ONLY,0);//支持ipv6&v4
Nanomsg.SocketOption靜態枚舉內支持很多參數調節:
NN_SUB_UNSUBSCRIBE,
NN_SUB_SUBSCRIBE,
NN_SNDFD,
NN_RCVFD,
NN_LINGER,
NN_SNDBUF,
NN_RCVBUF,
NN_RCVMAXSIZE,
NN_SNDTIMEO,
NN_RCVTIMEO,
NN_RECONNECT_IVL,
NN_RECONNECT_IVL_MAX,
NN_SNDPRIO,
NN_RCVPRIO,
NN_IPV4ONLY,
NN_SOCKET_NAME;
可以自己搜索用法
錯誤引流:
Caused by: nanomsg.exceptions.IOException: No such device