2017-02-07 6 views
0

Я пытаюсь простой код:ZeroMQ в ходе не будет печатать мое JSon сообщения байт от PULL розетки

package main 

import (
    "fmt" 
    zmq "github.com/alecthomas/gozmq" 
) 

func main() { 
    context, _ := zmq.NewContext() 
    defer context.Close() 

    // Socket to receive messages on 
    receiver, _ := context.NewSocket(zmq.PULL) 
    defer receiver.Close() 
    receiver.Connect("tcp://localhost:5557") 

    // Process tasks forever 
    for { 
     msgbytes, _ := receiver.Recv(0) 
    fmt.Println("received") 
     fmt.Println(string(msgbytes)) 
    } 
} 

В NodeJS я отправляю сообщение, как это:

console.log(payload); 
sender.send(JSON.stringify(payload)); 

я могу см. json на консоли, поэтому sender.sen() фактически отправляет вещи. Кроме того, выход из программы .go для каждой полезной нагрузки:

received 
[] 
received 
[] 

Там нет никакого вывода. Я искал GoDocs для метода Recv и нет разделения как recv_json, recv_message, etc, как на других языках, это все байты. Так что происходит? Я отправляю строку, потому что она отправляется как stringfy, не так ли?

UPDATE

Как сказано ниже Nehal, я изменил оператор импорта в официальную репутацию, и это новый код:

пакет главного

import (
    "fmt" 
    zmq "gopkg.in/zeromq/goczmq.v4" 
) 

func main() { 
    // Socket to receive messages on 
    receiver, _ := zmq.NewPull("tcp://*:5557") 
    defer receiver.Destroy() 

    // Process tasks forever 
    for { 
     request, _ := receiver.RecvMessage() 
    fmt.Println("received") 
     fmt.Println(request) 
    } 
} 

Но на этот раз " полученное "даже не напечатано, кажется, что сообщение не получено вообще

+0

Попробуйте 'goczmq'. https://godoc.org/github.com/zeromq/goczmq#Sock.RecvMessage –

+0

@NehalJWani Я обновил код, не могли бы вы взглянуть? –

ответ

1

Сервер в go:

import (
    "fmt" 
    zmq "gopkg.in/zeromq/goczmq.v4" 
) 

func main() { 
    // Socket to receive messages on 
    receiver, err := zmq.NewPull("tcp://*:5557") 
    if err != nil { 
     panic(err) 
    } 

    defer receiver.Destroy() 

    // Process tasks forever 
    for { 
     request, err := receiver.RecvMessage() 
     if err != nil { 
      panic(err) 
     } 
     fmt.Printf("Received: '%s'\n", request) 
    } 
} 

Клиент в Node.js:

var zmq = require('zmq') 
    , sock = zmq.socket('push'); 

sock.connect('tcp://127.0.0.1:5557'); 
setInterval(function(){ 
    console.log('Sending data'); 
    sock.send(JSON.stringify({'msg': 'Hi There!'})); 
}, 500); 

Server Side:

$ go run a.go 
Received: '[{"msg":"Hi There!"}]' 
Received: '[{"msg":"Hi There!"}]' 
... 

стороне клиента:

$ node a.js 
Sending data 
Sending data 
... 

RecvMessage Документация: https://godoc.org/github.com/zeromq/goczmq#Sock.RecvMessage

Node.js пакет: https://github.com/JustinTulloss/zeromq.node

Отличные zmq примеры в ходу: https://github.com/booksbyus/zguide/tree/master/examples/Go

Nice начать работу учебник: http://taotetek.github.io/oldschool.systems/post/goczmq1/

+0

Почему вы предоставили полный адрес для nodejs, но не для go? Есть ли разница? Я пытаюсь использовать tcp: // *: 5557 для обоих, и я уже получаю адрес gettind –

+0

Код 'pull' будет _listen_ на всех интерфейсах для входящих подключений tcp на порт 5557, следовательно:' tcp: // *: 5557'. Код 'push' будет _connect_ к порту 5557 через tcp на определенном интерфейсе, в данном случае являясь' 127.0.0.1' aka 'localhost'. –