https://github.com/cemuka/telegraph
Message driven, TCP networking in Unity, built on Telepathy and MessagePack.
https://github.com/cemuka/telegraph
client message-pack network server tcp telepathy unity
Last synced: 11 months ago
JSON representation
Message driven, TCP networking in Unity, built on Telepathy and MessagePack.
- Host: GitHub
- URL: https://github.com/cemuka/telegraph
- Owner: cemuka
- Created: 2021-04-04T22:52:48.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2021-04-05T21:40:42.000Z (almost 5 years ago)
- Last Synced: 2025-03-17T04:51:35.997Z (11 months ago)
- Topics: client, message-pack, network, server, tcp, telepathy, unity
- Language: C#
- Homepage:
- Size: 2.04 MB
- Stars: 9
- Watchers: 1
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.MD
Awesome Lists containing this project
README
Telegraph is built on [Telepathy](https://github.com/vis2k/Telepathy) and [MessagePack](https://github.com/neuecc/MessagePack-CSharp).
I also made a custom command console, inspired by Quantum Console from unity asset store.
Project contains a chat sample for server and client.
`ServerApplicationStartup.cs`
```csharp
using System;
using UnityEngine;
using CommandConsole;
public class ServerApplicationStartup : MonoBehaviour
{
private Server _server;
private MessageHandler _handler;
private CommandConsole.Console _console;
private void Start()
{
Application.targetFrameRate = 60;
_server = new Server();
_server.Start(7777);
_server.ClientConnectedEvent += OnClientConnect;
_server.MessageReceivedEvent += OnMessage;
_server.ClientDisconnectedEvent += OnClientDisconnect;
_handler = new MessageHandler();
_handler.AddHandler("chat", HandleChatMessage);
_console = new CommandConsole.Console();
_console.Initialize();
_console.Register("greet_all", ClientGreeter);
}
private void ListenConsoleInput()
{
if (Input.GetKey(KeyCode.LeftShift) && Input.GetKeyDown(KeyCode.Tab))
{
_console.Show();
}
if (Input.GetKeyDown(KeyCode.Escape))
{
_console.Hide();
}
}
// event callbacks
private void OnClientConnect(int connId)
{
var greet = new GreetPacket()
{
id = connId,
greetMessage = "Server connection success. Welcome to chat."
};
var msg = new Message()
{
header = "greet",
packet = greet.Serialize()
};
_server.Send(connId, msg.Serialize());
}
private void OnMessage(int connId, ArraySegment data)
{
_handler.Handle(data);
}
private void OnClientDisconnect(int connId)
{
Debug.Log("Client connection lost. connId: " + connId);
}
private void OnApplicationQuit()
{
_server.Stop();
}
// handlers
private void HandleChatMessage(ArraySegment data)
{
var chat = data.Deserialize();
Debug.Log("received chat, author: " + chat.author);
var msg = new Message()
{
header = "chat",
packet = data
};
_server.SendAll(msg.Serialize());
}
// tick server
private void Update()
{
ListenConsoleInput();
_server.Tick(100);
}
// console commands
private void ClientGreeter(string[] args)
{
var greet = new GreetPacket()
{
id = -1,
greetMessage = "Server watch you. Take care."
};
var msg = new Message()
{
header = "greet",
packet = greet.Serialize()
};
_server.SendAll(msg.Serialize());
}
}
```
`ClientApplicationStartup.cs`
```csharp
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClientApplicationStartup : MonoBehaviour
{
public string ip = "127.0.0.1";
public int port = 7777;
public Transform canvasParent;
public GameObject loginPrefab;
public GameObject chatPrefab;
private string _clientNickname;
private ChatPanel _chatPanel;
private Client _client;
private MessageHandler _handler;
private void Start()
{
Application.targetFrameRate = 60;
var login = Instantiate(loginPrefab, canvasParent).GetComponent();
login.inputField.onEndEdit.AddListener(input => _clientNickname = input );
login.connectButton.onClick.AddListener(() => Connect());
}
private void CreateChatPanel()
{
_chatPanel = Instantiate(chatPrefab, canvasParent).GetComponent();
_chatPanel.chatLogText.text = "";
_chatPanel.inputField.onEndEdit.AddListener(OnChatInput);
_chatPanel.inputField.ActivateInputField();
}
private void Connect()
{
CreateChatPanel();
_client = new Client();
_client.Start(ip, port);
_client.OnMessageReceived += MessageReceived;
_handler = new MessageHandler();
_handler.AddHandler("chat", HandleChatMessage);
_handler.AddHandler("greet", GreetHandleMessage);
}
// event callbacks
private void MessageReceived(ArraySegment msg)
{
_handler.Handle(msg);
}
private void OnChatInput(string input)
{
if (!string.IsNullOrEmpty(input) && !string.IsNullOrWhiteSpace(input))
{
var chat = new ChatPacket()
{
author = _clientNickname,
entry = input
};
var msg = new Message()
{
header = "chat",
packet = chat.Serialize()
};
_client.Send(msg.Serialize());
_chatPanel.inputField.text = "";
_chatPanel.inputField.ActivateInputField();
}
}
private void OnApplicationQuit()
{
_client.Disconnect();
}
// handlers
private void HandleChatMessage(ArraySegment chatData)
{
var chat = chatData.Deserialize();
// log to view
_chatPanel.AddLog(chat.author + ": " + chat.entry);
}
private void GreetHandleMessage(ArraySegment chatData)
{
var greet = chatData.Deserialize();
_chatPanel.AddLog(greet.greetMessage);
_chatPanel.AddLog("Connection id: " + greet.id);
}
// tick client
private void Update()
{
_client.Tick(100);
}
}
```