サーバーから別のサーバーへメッセージを送る

Diarkis サーバーはサーバ同士で、メッセージを送受信することができます。これは、Diarkis サーバーのプロセスから別のサーバプロセスにデータをリレーする場合に有効です。

サーバーは他のサーバーからメッセージを受信すると、受信したメッセージを適切に処理するために、メッセージに対応するハンドラ関数を探さなければなりません。

各メッセージは、どのハンドラ関数を呼び出すべきかをサーバーに知らせるために、「コマンドID」を指定してメッセージを送信します。

ハンドラ関数の定義方法


他のサーバーからのメッセージを処理するためには、まずハンドラ関数を定義する必要があります。
各ハンドラ関数は、任意の「コマンドID」と関連付けられている必要があります。
同じ "コマンドID "を持つ複数のハンドラ関数がある場合は、ハンドラ関数が定義された順番に呼び出されます。

// import "github.com/Diarkis/diarkis/mesh"
// import "github.com/Diarkis/diarkis/datacapsule"
// import "fmt"

// You must define the handler function when the server process starts

var myCommandID uint16 = 1024

mesh.HandleCommand(myCommandID, myCommandHandler)

func myCommandHandler(data map[string]interface{}) ([]byte, error) {

myName := mesh.GetString(data, "myName")

myScheduleBytes := mesh.GetBytes(data, "mySchedule")

// Reconstruct mySchedule data created by datacapsule
mySchedule, err := datacapsule.Unpack(myScheduleBytes)

if err != nil {
// handle the error....
}

appointments := mySchedule.GetAsArray("appointments")

for _, item := range appointments {
date := item.(map[string]string)["date"]
title := item.(map[string]string)["title"]
fmt.Printf("Appointment: Date: %s Title: %s", date, title)
}

return nil, nil
}

メッセージの送り方

メッセージを受信したサーバーがメッセージを正しく処理できるように、サーバーの内部アドレスと "コマンドID "で送信先のサーバープロセスを指定する必要があります。

// import "github.com/Diarkis/diarkis/server"
// import "github.com/Diarkis/diarkis/mesh"
// import "github.com/Diarkis/diarkis/datacapsule"

var myCommandID uint16 = 1024

// Get all UDP server addresses
udpServerAddresses := mesh.GetNodeAddressesByType(server.UDPType)

if len(udpServerAddresses) == 0 {
// no UDP servers found....
return
}

// choose one UDP server from the list
udpServerAddress := udpServerAddresses[0]

// create the data to send
data := make(map[string]interface{})
data["myName"] = "Jon"
mySchedule := datacapsule.NewCapsule()
appointments := make([]map[string]string, 2)
appointments[0] = map[string]{ "date": "01/01/2022", "title": "New Year Party" }
appointments[1] = map[string]{ "date", "25/12/2022", "title": "Christmas Party" }
mySchedule.SetAsArray("appointments", appointments)
data["mySchedule"] = datacapsule.Pack(mySchedule)

mesh.Send(myCommandID, udpServerAddress, data)