zmqによる画像の転送

4500 ワード

元のデータ

cv::Mat mat

エンコーディング

vector data_encode;
cv::imencode(".jpg",mat,data_encode);

トランスファ

zmq::context_t context(1);
zmq::socket_t skt(context,ZMQ_PUB);
skt.bind("tcp://*:20000);
zmq::message_t msg(data_encode.size());
memcpy(msg.data(),data_encode.data(),data_encode.size());
skt.send(msg);

転送(実際の状況によって中継した)

zmq::context_t context(1);
zmq::socket_t socket_get(context,ZMQ_SUB);
socket_get.setsockopt(ZMQ_SUBSCRIBE,"",0);
socket_get.connect("tcp://127.0.0.1:20000");

zmq::socket_t socket_pos(context,ZMQ_PUB);
socket_pos.setsockeopt(ZMQ_CONFLATE,1);// 1, 。 。。 
socket_pos.bind("tcp://*:20001");
while(true){
    zmq::message_t request;
    socket_get.recv(&request);
    if(request.size()==0)
        break;
    socket_pos.send(request);
}

じゅしん

@Override
public void run(){
    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket socket = context.socket(ZMQ.SUB);
    socket.subscribe("");
    socket.setConflate(true);
    socket.connect("tcp://192.168.xx.xx:200001");
    while(!Thread.currenThread().isInterrupted()){
        byte[] msg = socket.recv(0);
        UIThreadHandler.sendMessage(....);
    }
    socket.close();
    context.term();
}

表示

    private void clientMessageReceived(byte[] msgBody){
        ByteArrayInputStream inputStream = new ByteArrayInputStream(msgBody);
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        imageView.setImageBitmap(bitmap);

}