C# REQ/REP模式中的ZeroMQ FiniteStateMachineException

C# REQ/REP模式中的ZeroMQ FiniteStateMachineException,c#,python,zeromq,pyzmq,netmq,C#,Python,Zeromq,Pyzmq,Netmq,我有两个简单的组件,它们应该使用REQ/REP ZeroMQ模式相互通信。 服务器(REP Socket)是使用pyzmq在Python中实现的: import zmq def launch_server(): print "Launching server" with zmq.Context.instance() as ctx: socket = ctx.socket(zmq.REP) socket.bind('tcp://127.0.0.1:

我有两个简单的组件,它们应该使用REQ/REP ZeroMQ模式相互通信。 服务器(REP Socket)是使用pyzmq在Python中实现的:

import zmq

def launch_server():
    print "Launching server"
    with zmq.Context.instance() as ctx:
        socket = ctx.socket(zmq.REP)
        socket.bind('tcp://127.0.0.1:5555')

        while True:
            msg = socket.recv()
            print "EOM\n\n"
使用NetMQ库以C#编写的客户端(REQ套接字):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NetMQ;


namespace PyNetMQTest
{
    class Program
    {

        static void Main(string[] args)
        {
            string msg;
            NetMQ.Sockets.RequestSocket socket = new NetMQ.Sockets.RequestSocket();
            socket.Connect("tcp://127.0.0.1:5555");
            for(int i=0; i<5; i++)
                socket.SendFrame("test_"+i);
        }
    }
}
这是我使用ZMQ的第一步,C#代码取自库是什么导致代码抛出此错误?

我正在使用:

  • pyzmq 14.7
  • NetMQ 3.3.3.4
  • .NET 4.6

==================================================================================

正如@somdoron在他的回答中所解释的,原因是两个套接字都需要经过整个发送/接收周期,才能重用。 事实上,python中实现的REP套接字也没有改变它的状态,因此python和C#代码中都存在错误。以下是固定代码:

代表插座

import zmq

def launch_server():
    print "Launching server"
    with zmq.Context.instance() as ctx:
        socket = ctx.socket(zmq.REP)
        socket.bind('tcp://127.0.0.1:5555')

        while True:
            msg = socket.recv()
            socket.send("reply to "+msg)
            print "EOM\n\n"
请求套接字

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NetMQ;


namespace PyNetMQTest
{
    class Program
    {

        static void Main(string[] args)
        {

            NetMQ.Sockets.RequestSocket socket = new NetMQ.Sockets.RequestSocket();
            socket.Connect("tcp://127.0.0.1:5555");

            string msg, reply;

            while (true)
            {
                Console.WriteLine("Type message: ");
                msg = Console.ReadLine();
                Console.WriteLine("Sending : " + msg);
                socket.SendFrame(msg);
                reply = socket.ReceiveFrameString();
                Console.WriteLine("Received: " + reply + Environment.NewLine);
            }
        }
    }
}

请求和响应套接字是状态机,必须先发送请求,然后调用接收,不能连续调用5次发送

如果响应相反,则必须先调用Receive


如果一方仅发送,另一方仅接收,则可以使用推拉模式而不是Req-Rep。如果需要双向通信,也可以使用经销商路由器。无论如何,Req Rep的用法似乎不正确。

谢谢@somdoron!就是这样!我不知道有限状态机的概念。将向问题正文中添加更正的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NetMQ;


namespace PyNetMQTest
{
    class Program
    {

        static void Main(string[] args)
        {

            NetMQ.Sockets.RequestSocket socket = new NetMQ.Sockets.RequestSocket();
            socket.Connect("tcp://127.0.0.1:5555");

            string msg, reply;

            while (true)
            {
                Console.WriteLine("Type message: ");
                msg = Console.ReadLine();
                Console.WriteLine("Sending : " + msg);
                socket.SendFrame(msg);
                reply = socket.ReceiveFrameString();
                Console.WriteLine("Received: " + reply + Environment.NewLine);
            }
        }
    }
}