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)