One network-library to rule them all!
This project was started very recently, 13/07/19, and has not been extensively tested. It's very likely syntax changes will occur and bugs will appear. Please report errors/inconveniences and improve on this project via pull requests :-)
- Support for simultaneous UDP + TCP with their respective transport layer
- Built-In: Telepathy, a lightweight & efficient TCP transport layer
- Built-In: MiniUDP, a barebones UDP transport layer(implemented as unreliable but fast)
- Interface: ITransportLayer, a simple and documented interface to (theoritcally) implement any transport layer into HybridNetLib
- Switching transport layers(from/to TCP, UDP, it doesn't matter) requires 1 line of code
- Support for any object → byte[] serializer
- Built-In: CobblestoneSerializer, a very simple simple and expandible serializer which lets you sent objects over the network
The following sample uses the built-in Telepathy & MiniUDP transport layers for networking, and built-in CobblestoneSerializer for serializing.
var client = new ClientNetManager(
new TransportLayerInfo[] { new TransportLayerInfo(new TelepathyTransport(), 1337), new TransportLayerInfo(new MiniUdpTransport(), 1447) },
new CobblestoneSerializer());
client.RegisterPacket(typeof(PacketMessage));
client.Subscribe(packet => {
if (packet is PacketMessage message)
{
Logger.Log("Server: " + message.text);
}
});
client.Connect("127.0.0.1");
while (true)
{
if (Console.KeyAvailable)
{
var key = Console.ReadKey(true).Key;
if (key == ConsoleKey.A)
client.Send(new PacketMessage("Hello there, server!"), 0);
else if (key == ConsoleKey.B)
client.Send(new PacketMessage("Epic mate"), 1);
else if (key == ConsoleKey.Q)
{
client.Disconnect();
break;
}
}
client.Update();
Thread.Sleep(16);
}
var server = new ServerNetManager(
new TransportLayerInfo[] { new TransportLayerInfo(new TelepathyTransport(), 1337), new TransportLayerInfo(new MiniUdpTransport(), 1447) },
new CobblestoneSerializer());
server.RegisterPacket(typeof(PacketMessage));
server.Subscribe((packet, sender) => {
if (packet is PacketMessage message)
{
Logger.Log(sender.Address + ": " + message.text);
}
});
server.Start();
while (true)
{
if (Console.KeyAvailable)
{
var key = Console.ReadKey(true).Key;
if (key == ConsoleKey.A)
server.Send(new PacketMessage("Hey there, clients!"), 0);
else if (key == ConsoleKey.B)
server.Send(new PacketMessage("I'm gonna do what's called a pro-gamer move..."), 1);
else if (key == ConsoleKey.Q)
{
server.Stop();
break;
}
}
server.Update();
Thread.Sleep(16);
}
public struct PacketMessage
{
/*
* The attribute [NetSerializable] must be assigned to any field/property which will be sent over the network.
*
* Supported: Public/Private/Protected access modifiers
* Supported: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort, Arrays(any dimensions)
* Note: Arrays in the format T[,] won't work, but T[][] will.
*/
[NetSerializable] public string text;
public PacketMessage(string text)
{
this.text = text;
}
}
- Telepathy: You need to use my fork which has very minor adjustments, found @ https://github.com/NahoyGames/Telepathy
- MiniUDP: Original works just fine @ https://github.com/ashoulson/MiniUDP