The following example is a bit bloated but it will give you an idea. It uses Hyperion serializer to serialize a MyMessage object into memorysteam that is feed to the outgoing queue as a bytearray. Also I use FluentScheduler to async send a message every 5 seconds.
namespace NetMQClient
{
class MyMessage
{
public string PropertyName { get; set; }
}
class Program
{
static NetMQQueue<byte[]> OutgoingQueue = new NetMQQueue<byte[]>();
volatile static int failed = 0;
static void Main(string[] args)
{
var SocketDemo = new SocketDemo();
}
public class SocketDemo
{
DealerSocket client = null;
public SocketDemo()
{
client = new DealerSocket();
client.Options.Identity = Encoding.Unicode.GetBytes(Guid.NewGuid().ToString());
client.Options.SendHighWatermark = 1;
client.Options.Linger = new TimeSpan(0, 0, 10);
var registry = new Registry();
registry.Schedule(() =>
{
var serializer = new Hyperion.Serializer(new Hyperion.SerializerOptions(versionTolerance: false, preserveObjectReferences: true));
var valserializer = serializer.GetSerializerByType(typeof(MyMessage));
for (int i = 0; i < 100; i++)
{
var ms = new MemoryStream();
valserializer.WriteValue(ms,new MyMessage { PropertyName = "abc"}, new Hyperion.SerializerSession(serializer));
ms.Position = 0;
OutgoingQueue.Enqueue(ms.GetBuffer());
ms.Close();
//Thread.Sleep(delay);
}
}).ToRunEvery(5).Seconds();
JobManager.Initialize(registry);
var poller = new NetMQPoller { OutgoingQueue };
client.ReceiveReady += Client_ReceiveReady;
OutgoingQueue.ReceiveReady += (sender, args) => OutgoingData(OutgoingQueue.Dequeue());
poller.Add(client);
poller.RunAsync();
Console.ReadLine();
poller.StopAsync();
poller.Dispose();
client.Dispose();
}
private void OutgoingData(byte[] BytesToSendOut)
{
var messageToServer = new NetMQMessage();
messageToServer.AppendEmptyFrame();
messageToServer.Append(BytesToSendOut);
var res = client.TrySendMultipartMessage(new TimeSpan(0,0,1), messageToServer);
if (res == false)
{
failed++;
Console.WriteLine(failed);
}
messageToServer.Clear();
}
private void Client_ReceiveReady(object sender, NetMQSocketEventArgs e)
{
var ms = e.Socket.ReceiveMultipartMessage();
Console.WriteLine("REPLY {0}", ms[1].ConvertToString());