Q&A
- 错误 1 error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory d:\test\libzmq\src\windows.hpp 55 1 libzmq
- 选择libzmq项目,右键->属性->配置属性->常规->平台工具集 修改为 visual studio 2013 -Windows Xp(v120_xp)
- 因为我的sdk是vc的,所以得这样改。或者在包含目录里将路径引入也可。
- 错误 7 error LNK1181: 无法打开输入文件“libsodium.lib” D:\test\libzmq\builds\msvc\vs2013\libzmq\LINK libzmq
- 设置libzmq项目属性。右键->属性->配置属性->VC++ 目录 修改包含目录 为libzmq下的include目录。
- 错误 5 error MSB3030:
-“D:\test\libzmq\builds\msvc\vs2013\libzmq……….\libsodium\bin\Win32\Debug\v120_xp\dynamic\libsodium.dll”,原因是找不到该文件。 D:\test\libsodium\builds\msvc\vs2015\libsodium.import.props 31 5 libzmq
- 在\libsodium\bin\Win32\Debug 下将v120文件copy一个副本,并重命名为v120_xp
编译篇
我的配置
- vs版本 vs ultimate 2013
- 操作系统版本win7 Service Pack 1
- jdk8
公共包编译
- libsodium
git clone --depth 1 -b stable https://github.com/jedisct1/libsodium.git
- 用vs打开 libsodium\builds\msvc\vs2013\libsodium.sln
- 解决方案有DynRelease|x64 和DynDebug|x64 。我只是使用,所以选前者。
- 生成解决方案。生成成功后会在libsodium\bin\x64\Release\v120\dynamic下生成libsodium.dll和libsodium.lib
- libzmq
git clone git://github.com/zeromq/libzmq.git
- 用vs 打开 libzmq\builds\msvc\vs2013\libzmq.sln
- 解决方案配置DynRelease|x64
- 生成解决方案。生成成功后会在libzmq\bin\x64\Release\v120_xp\dynamic生成dll和lib文件
- zeromq
- 建立文件夹 zeromq
- 分别建立两个子文件:lib,include
- 将libzmq\include下头文件复制到include
- 将libzmq\bin\x64\Release\v120_xp\dynamic 下 libzmq.dll libzmq.lib复制到lib
- libsodium
java版
git clone git://github.com/zeromq/jzmq.git
- 打开
jzmq\jzmq-jni\builds\msvc\msvc.sln
- 选择jzmq 右键->属性->配置属性->VC++ 目录
- 修改包含目录,将以下三个目录加进去
- C:\Program Files\Java\jdk1.8.0_91\include
- C:\Program Files\Java\jdk1.8.0_91\include\win32
- zeromq\include (就是上一步中,自己建立的文件夹)
- 修改库目录,将zeromq\lib加入
- 以上路径都应该是绝对路径。
- 解决方案配置Release|x64
- 生成解决方案。jzmq\jzmq-jni\lib下有 jzmq.dll zmq.jar两个文件。zmq.jar需要放到zeromq\lib下。(据我测试,直接放在jdk的bin目录下亦是可行的)
- 如果要使用java版。需要将zeromq\lib和jzmq\jzmq-jni\lib目录添加到环境变量中(这一步似乎是可省略的,但是有的人省略这一步会报错)。并将jar包导入到项目中。
- 如果jar包中缺少一些包或类,可另行下载低版本的jar代替
Hello World篇
java 版测试–REQ&REP。
- 这个例子用来测试zmq是否能正常工作
server
package server; import org.zeromq.ZMQ; public class JServer { public static void main(String[] args) throws InterruptedException { ZMQ.Context context = ZMQ.context(1); ZMQ.Socket responder = context.socket(ZMQ.REP); responder.bind("tcp://*:5555"); while(!Thread.currentThread().isInterrupted()){ //阻塞消息 byte[] request = responder.recv(0); System.out.println("received " + new String(request)); Thread.sleep(1); String reply = "World"; responder.send(reply.getBytes(),0); } responder.close(); context.term(); } }
Client
package client; import org.zeromq.ZMQ; public class JClient { public static void main(String[] args) { ZMQ.Context context = ZMQ.context(1); System.out.println("Connecting to hello world server..."); ZMQ.Socket requester = context.socket(ZMQ.REQ); requester.connect("tcp://localhost:5555"); for (int requestNbr = 0; requestNbr != 10; requestNbr++) { String request = "Hello"; System.out.println("Sending Hello " + requestNbr); requester.send(request.getBytes(), 0); byte[] reply = requester.recv(0); System.out.println("Received " + new String(reply) + " " + requestNbr); } requester.close(); context.term(); } }