186 lines
6.3 KiB
Markdown
186 lines
6.3 KiB
Markdown
# Tesses.RPC
|
|
|
|
A Simple RPC Library for my WebServer
|
|
|
|
# License
|
|
|
|
![GPL3-only](https://www.gnu.org/graphics/gplv3-with-text-136x68.png)
|
|
Licensed under [GPL3](https://www.gnu.org/licenses/)
|
|
|
|
# How to use (client)
|
|
|
|
Install [this](https://nuget.org/packages/Tesses.RPCClient) nuget package if you are not using blazor wasm or if you are use [this package](https://nuget.org/packages/Tesses.SystemNetWebSocketsRPC)
|
|
```csharp
|
|
using Tesses.RPC;
|
|
|
|
public interface IMessage
|
|
{
|
|
}
|
|
public enum MessageType
|
|
{
|
|
Text,
|
|
Number
|
|
}
|
|
public class TextMessage : IMessage
|
|
{
|
|
public string Text {get;set;}
|
|
}
|
|
public class NumberMessage : IMessage
|
|
{
|
|
public int Number {get;set;}
|
|
}
|
|
|
|
public class Program
|
|
{
|
|
public static void Main(string[] args)
|
|
{
|
|
JsonMessager<MessageType,IMessage>? messager=null;
|
|
var msghndlr=new WebSocketClientMessageHandler
|
|
(
|
|
"ws://localhost:4222",
|
|
()=>{
|
|
//do something when connection starts such as send messages or registering callbacks
|
|
if(messager!= null)
|
|
{
|
|
TextMessage messageToSend = new TextMessage();
|
|
messageToSend.Text="Demi Lovato";
|
|
messager.SendMessage<TextMessage>(messageToSend);
|
|
|
|
//or if you want to receive a response
|
|
messager.SendMessage<TextMessage>(
|
|
messageToSend,
|
|
(msg)=>{
|
|
TextMessage receivedMessage=msg;
|
|
//do something with message
|
|
}
|
|
);
|
|
}
|
|
}
|
|
);
|
|
messager = new JsonMessager<MessageType, IMessage>(msghndlr);
|
|
|
|
messager.Register<TextMessage>(
|
|
MessageType.Text,
|
|
(msg)=>{
|
|
TextMessage receivedMessage=msg.Data;
|
|
|
|
if(msg.NeedReply)
|
|
{
|
|
TextMessage replyMessage=new TextMessage();
|
|
replyMessage.Text = "Something";
|
|
//send message to server
|
|
//you can send original message if you want
|
|
msg.Reply(replyMessage);
|
|
}
|
|
}
|
|
);
|
|
messager.Register<NumberMessage>(
|
|
MessageType.Number,
|
|
(msg)=>{
|
|
NumberMessage receivedMessage=msg.Data;
|
|
|
|
if(msg.NeedReply) //true if server sends message with messager.SendMessage<SomeType>(variable,(res)=>{});
|
|
{
|
|
NumberMessage replyMessage=new NumberMessage();
|
|
replyMessage.Text = 42;
|
|
//send message to server
|
|
//you can send original message if you want
|
|
msg.Reply(replyMessage);
|
|
}
|
|
}
|
|
);
|
|
messager.Connect();
|
|
}
|
|
}
|
|
```
|
|
|
|
# How to use (server)
|
|
Install [this](https://nuget.org/packages/Tesses.WebServer.WebSocketRPC) nuget package (and [this one](https://nuget.org/packages/Tesses.WebServer.EasyServer))
|
|
```csharp
|
|
using Tesses.RPC;
|
|
using Tesses.WebServer;
|
|
|
|
public interface IMessage
|
|
{
|
|
}
|
|
public enum MessageType
|
|
{
|
|
Text,
|
|
Number
|
|
}
|
|
public class TextMessage : IMessage
|
|
{
|
|
public string Text {get;set;}
|
|
}
|
|
public class NumberMessage : IMessage
|
|
{
|
|
public int Number {get;set;}
|
|
}
|
|
|
|
public class Program
|
|
{
|
|
public static void Main(string[] args)
|
|
{
|
|
RouteServer svr=new RouteServer();
|
|
svr.Add(
|
|
"/",
|
|
async (e)=>{
|
|
RPCServer ews=new RPCServer(
|
|
(mhandler)=>{
|
|
JsonMessager<MessageType,IMessage> messager=new JsonMessager<MessageType,IMessage>(mhandler);
|
|
|
|
messager.Register<TextMessage>(
|
|
MessageType.Text,
|
|
(msg)=>{
|
|
TextMessage receivedMessage=msg.Data;
|
|
|
|
if(msg.NeedReply)
|
|
{
|
|
TextMessage replyMessage=new TextMessage();
|
|
replyMessage.Text = "Something";
|
|
//send message to client
|
|
//you can send original message if you want
|
|
msg.Reply(replyMessage);
|
|
}
|
|
}
|
|
);
|
|
messager.Register<NumberMessage>(
|
|
MessageType.Number,
|
|
(msg)=>{
|
|
NumberMessage receivedMessage=msg.Data;
|
|
|
|
if(msg.NeedReply) //true if client sends message with messager.SendMessage<SomeType>(variable,(res)=>{});
|
|
{
|
|
NumberMessage replyMessage=new NumberMessage();
|
|
replyMessage.Text = 42;
|
|
//send message to client
|
|
//you can send original message if you want
|
|
msg.Reply(replyMessage);
|
|
}
|
|
}
|
|
);
|
|
//end or registtering server
|
|
TextMessage messageToSend = new TextMessage();
|
|
messageToSend.Text="Demi Lovato";
|
|
messager.SendMessage<TextMessage>(messageToSend);
|
|
|
|
//or if you want to receive a response
|
|
messager.SendMessage<TextMessage>(
|
|
messageToSend,
|
|
(msg)=>{
|
|
TextMessage receivedMessage=msg;
|
|
//do something with message
|
|
}
|
|
);
|
|
}
|
|
);
|
|
await e.StartEasyWebSocketConnectionAsync(ews);
|
|
}
|
|
);
|
|
svr.StartServer(4222);
|
|
}
|
|
}
|
|
```
|
|
|
|
# Can I implement a client in other languages
|
|
Yes this program uses json and [here](https://tesses.net/libs/Tesses.RPC/HOWTOOTHERLANG.txt) is some documentation on json structure (uses text in WebSocket but I designed this to be usable with other means of transport (as long as sending and receiving are on seperate threads)) |