サーバーから別のサーバーにリクエストメッセージを送信し、レスポンスを受信する

Diarkis サーバーは、他のサーバーにリクエストメッセージを送信し、リクエストに対するレスポンスを受け取ることができます。

Diarkisサーバーは、リクエストとレスポンス形式のメッセージを送受信することができます。

これは、複数のDiarkisサーバーが動作を調整し、データを交換する必要がある場合に有効です。

ハンドラ関数を定義する方法

// 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)
  }

  // Add a new appointment and send it back as response
  appointments = append(appointments, map[string]{ "date": "14/2/2022", "Valentines Day" })

  // Update mySchedule
  mySchedule.SetAsArray("appointments", appointments)

  response := make(map[string]interface{})
  response["updatedMySchedule"] = datacapsule.Pack(mySchedule)

  return mesh.CreateReturnBytes(response)
}

リクエストの送信とレスポンスの受信方法

The response will be received by the callback you assign when you send a request.

// 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.SendRequest(myCommandID, udpServerAddress, data, handleMyResponse)

func handleMyResponse(response map[string]interface{}) {

  updatedMyScheduleBytes := mesh.GetBytes(response, "updatedMySchedule")

  updatedMySchedule, err := mesh.Unpack(updatedMyScheduleBytes)

  // Do something awesome here!
}

最終更新