You are here: Client-Server > Messaging

Messaging

In client/server it possible to send messages between a client and the server. Possible use cases could be:

Sending and Receiving Messages

First you need to decide on a class that you want to use as the message. Any object that is storable in db4o can be used as a message. Of course you use multiple classes for representing different messages. Let's create a dedicated class.

public class HelloMessage
{
    private readonly string message;

    public HelloMessage(string message)
    {
        this.message = message;
    }

    public override string ToString()
    {
        return message;
    }
}
MessagingExample.cs: The message class
Public Class HelloMessage
    Private ReadOnly message As String

    Public Sub New(ByVal message As String)
        Me.message = message
    End Sub

    Public Overrides Function ToString() As String
        Return message
    End Function
End Class
MessagingExample.vb: The message class

Now you need to register a handler to handle arriving messages. This can be done by configuring a message recipient on the server. Let's simply print out the arriving message. Additionally we answer to the client with another message.

IServerConfiguration configuration = Db4oClientServer.NewServerConfiguration();
configuration.Networking.MessageRecipient = new ServerMessageReceiver();
IObjectServer server = Db4oClientServer.OpenServer(configuration, DatabaseFile, PortNumber);
MessagingExample.cs: configure a message receiver for the server
Dim configuration As IServerConfiguration = Db4oClientServer.NewServerConfiguration()
configuration.Networking.MessageRecipient = New ServerMessageReceiver()
Dim server As IObjectServer = Db4oClientServer.OpenServer(configuration, DatabaseFile, PortNumber)
MessagingExample.vb: configure a message receiver for the server
class ServerMessageReceiver : IMessageRecipient
{
    public void ProcessMessage(IMessageContext context, object message)
    {
        Console.WriteLine("The server received a '{0}' message", message);
        // you can respond to the client
        context.Sender.Send(new HelloMessage("Hi Client!"));
    }
}
MessagingExample.cs: The message receiver for the server
Private Class ServerMessageReceiver
    Implements IMessageRecipient
    Public Sub ProcessMessage(ByVal context As IMessageContext, ByVal message As Object) _
        Implements IMessageRecipient.ProcessMessage
        Console.WriteLine("The server received a '{0}' message", message)
        ' you can respond to the client
        context.Sender.Send(New HelloMessage("Hi Client!"))
    End Sub
End Class
MessagingExample.vb: The message receiver for the server

The same can be done on the client. Register a handler for the received messages.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.Networking.MessageRecipient = new ClientMessageReceiver();
MessagingExample.cs: configure a message receiver for a client
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.Networking.MessageRecipient = New ClientMessageReceiver()
MessagingExample.vb: configure a message receiver for a client
class ClientMessageReceiver : IMessageRecipient
{
    public void ProcessMessage(IMessageContext context, object message)
    {
        Console.WriteLine("The client received a '{0}' message",message);
    }
}
MessagingExample.cs: The message receiver for the client
Private Class ClientMessageReceiver
    Implements IMessageRecipient
    Public Sub ProcessMessage(ByVal context As IMessageContext, ByVal message As Object) _
        Implements IMessageRecipient.ProcessMessage
        Console.WriteLine("The client received a '{0}' message", message)
    End Sub
End Class
MessagingExample.vb: The message receiver for the client

Now on the client we can get a message sender. The message sender allows you to send a message to the server. In this example we send a hello message.

IMessageSender sender = configuration.MessageSender;
using (IObjectContainer container = Db4oClientServer.OpenClient(configuration, "localhost",
                                                                PortNumber, UserAndPassword,
                                                                UserAndPassword))
{
    sender.Send(new HelloMessage("Hi Server!"));
    WaitForAWhile();
}
MessagingExample.cs: Get the message sender and use it
Dim sender As IMessageSender = configuration.MessageSender
Using container As IObjectContainer = Db4oClientServer.OpenClient(configuration, _
            "localhost", PortNumber, UserAndPassword, UserAndPassword)
    sender.Send(New HelloMessage("Hi Server!"))
    WaitForAWhile()
End Using
MessagingExample.vb: Get the message sender and use it