这是我的节点代码
async function runClient() {
console.log('Connecting to hello world server…');
// Socket to talk to server
const sock = new zmq.Request();
sock.connect('tcp://localhost:5555');
let i = 0;
while (true) {
const msgToSend = 'Hello';
console.log(`Count: ${i} Sending: ${msgToSend}`);
await sock.send(msgToSend);
const [result] = await sock.receive();
console.log(`Count: ${i} Received: ${result.toString()}`);
i++;
}
}
这是我的 Golang
package main
import (
"log"
"time"
zmq "github.com/pebbe/zmq4"
)
func main() {
responder, _ := zmq.NewSocket(zmq.REP)
defer responder.Close()
responder.Bind("tcp://*:5555")
for {
// Wait for next request from client
msg, _ := responder.Recv(0)
log.Printf("Received %sr\n", msg)
// Do some 'work'
time.Sleep(time.Second * 1)
// Send reply back to client
responder.Send("World", 0)
}
}
它们都已连接并且有输出到控制台,但有时,服务器(Golang)只是停在
responder.Recv(0)
或 responder.Send("World", 0)
,并出现这样的错误,
fatal error: schedule: in cgo
runtime stack:
runtime_mstart
../../../src/libgo/runtime/proc.c:596
goroutine 1 [runnable]:
github.com/pebbe/zmq4._C2func_zmq4_msg_recv
/tmp/go-build/b003/_cgo_gotypes.go:372
github.com/pebbe/zmq4.Socket.RecvBytes..func1
/home/uneex/go/pkg/mod/github.com/pebbe/zmq4@v1.2.10/zmq4.go:1082
github_0com_1pebbe_1zmq4.Socket.RecvBytes
/home/uneex/go/pkg/mod/github.com/pebbe/zmq4@v1.2.10/zmq4.go:1082
github_0com_1pebbe_1zmq4.Socket.Recv
/home/uneex/go/pkg/mod/github.com/pebbe/zmq4@v1.2.10/zmq4.go:1062
main.main
/mnt/c/Users/golang-user/zmq/main.go:148
exit status 2
/mnt/c/Users/golang-user/zmq/main.go:148
错误中的main.go:148
指向responder.Recv(0)
,但有时也可能是main.go:155
,那就是responder.Send("World", 0)
来自ZMQ指南,据说是
在 C 和其他一些语言中,字符串以 null 终止 字节。我们可以发送一个像“HELLO”这样带有额外空字节的字符串:
zmq_send (请求者, "你好", 6, 0);
但是,如果您从另一种语言发送字符串,它可能会 不包含该空字节
但我实际上不知道如何开始将字符串从 Go 格式化为 JavaScript,任何指导将不胜感激。
不管表面如何,字符串尤其依赖于实现。尝试输入一些特殊字符,您很快就会了解语言之间的差异以及它们对字符串的编码有何不同。正如 ZeroMQ 手册中的评论所说,C 做一件事,其他语言做另一件事。
ZeroMQ 本身只是字节的传输器,它不会为您翻译特定于语言的类型,尽管某些语言可能会以某种方式将字符串转换为字节。
最好的选择是使用异构序列化程序,例如 Google Protocol Buffers,并使用 ZeroMQ 来传输序列化消息。对于单纯的字符串来说,这听起来似乎有点矫枉过正,但它至少可以保证,无论使用什么语言,都不会遇到问题。此外,跨越卢比孔河后,您就可以轻松地混合更复杂的类型/消息结构。