tesses-rpc/README.md

186 lines
6.3 KiB
Markdown
Raw Normal View History

2022-12-12 17:24:00 +00:00
# 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))