{"id":16207654,"url":"https://github.com/cemuka/unitysimpletcpnetwork","last_synced_at":"2026-05-15T18:34:01.949Z","repository":{"id":118943428,"uuid":"352264283","full_name":"cemuka/UnitySimpleTCPNetwork","owner":"cemuka","description":"Simple chat app using tcp network in unity.","archived":false,"fork":false,"pushed_at":"2021-03-29T18:53:02.000Z","size":39,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-11T02:11:36.622Z","etag":null,"topics":["chat-application","client-server","multiplayer","network","server","tcp-client","tcp-server","unity","unity-tutorial","unity3d"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cemuka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-28T07:08:06.000Z","updated_at":"2024-12-26T19:56:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"58a5a958-ce1b-4cfd-ae0a-5a1377cebd0b","html_url":"https://github.com/cemuka/UnitySimpleTCPNetwork","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cemuka/UnitySimpleTCPNetwork","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FUnitySimpleTCPNetwork","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FUnitySimpleTCPNetwork/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FUnitySimpleTCPNetwork/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FUnitySimpleTCPNetwork/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cemuka","download_url":"https://codeload.github.com/cemuka/UnitySimpleTCPNetwork/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FUnitySimpleTCPNetwork/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33074857,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chat-application","client-server","multiplayer","network","server","tcp-client","tcp-server","unity","unity-tutorial","unity3d"],"created_at":"2024-10-10T10:14:08.294Z","updated_at":"2026-05-15T18:34:01.911Z","avatar_url":"https://github.com/cemuka.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Exploring TCP Network in Unity\n\nI have checked out several network libraries to use with unity. Then I wanted to\nmake a simple one from scratch. \n\nI found some tutorials and repos along the way and they helped a lot. But mostly, they were too complicated or abstracted. I just needed a dune buggy.\n\nSo, I tried my best to keep it simple and lean.\n\nHope that this project helps you, if you're trying to figure out TCP network in your game.\n\n### Why Unity as a Server?\n\nWhy would I use unity as a server while dotnet core is great?\n\nBecause unity has an editor, scene management, physics, navigation and so on. \n\n### Sample\n\nHere is the complete network folder below.\n\n```\n...\nNetwork\n└───Message\n│   │   Message.cs\n│   │   MessageHandler.cs\n│   │   MessageSerializeExtensions.cs\n│   Client.cs\n│   Connection.cs    \n│   Server.cs\n│   ThreadManager.cs\n...\n```\n\nOpen up the Server scene.\nThere is a component created for server to setup and listen `ServerApplicationStartup`.\n\n```csharp\nusing System;\nusing UnityEngine;\n\npublic class ServerApplicationStartup : MonoBehaviour\n{\n    private Server _server;\n    private MessageHandler _handler;\n\n    private void Start()\n    {\n        _server = new Server(7777);\n        _server.Start();\n        _server.ClientConnectedEvent    += OnClientConnect;\n        _server.MessageReceivedEvent    += OnMessage;\n        _server.ClientDisconnectedEvent += OnClientDisconnect;\n\n        _handler = new MessageHandler();\n        _handler.AddHandler(\"chat\", HandleChatMessage);\n    }\n\n    //  event callbacks\n    private void OnClientConnect(int connId)\n    {\n        var greet = new GreetData()\n        {\n            id = connId,\n            greetMessage = \"Server connection success. Welcome to chat.\"\n        };\n\n        var msg = new Message()\n        {\n            header = \"greet\",\n            body   = greet.Serialize()\n        };\n\n        _server.Send(connId, msg.Serialize());\n    }\n\n    private void OnMessage(int connId, byte[] data)\n    {\n        _handler.Handle(data);\n    }\n\n    private void OnClientDisconnect(int connId)\n    {\n        Debug.Log(\"Client connection lost. connId: \" + connId);\n    }\n\n    private void OnApplicationQuit()\n    {\n        _server.Stop();\n    }\n\n    //  handlers\n    private void HandleChatMessage(byte[] data)\n    {\n        var chat = data.Deserialize\u003cChatData\u003e();\n\n        Debug.Log(\"received chat, author: \" + chat.author);\n\n        var msg = new Message()\n        {\n            header = \"chat\",\n            body = data\n        };\n        \n        _server.SendAll(msg.Serialize());\n    }\n}\n```\n\nFor the client scene I created some ui elements. \n\n```csharp\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class ClientApplicationStartup : MonoBehaviour\n{\n    public string ip = \"127.0.0.1\";\n    public int port = 7777;\n    public Transform canvasParent;\n    public GameObject loginPrefab;\n    public GameObject chatPrefab;\n\n    private string _clientNickname;\n    private ChatPanel _chatPanel;\n\n    private Client _client;\n    private MessageHandler _handler;\n\n    private void Start()\n    {\n        var login = Instantiate(loginPrefab, canvasParent).GetComponent\u003cLoginPanel\u003e();\n        login.inputField.onEndEdit.AddListener(input =\u003e _clientNickname = input );\n        login.connectButton.onClick.AddListener(() =\u003e Connect());\n    }\n\n    private void CreateChatPanel()\n    {\n        _chatPanel = Instantiate(chatPrefab, canvasParent).GetComponent\u003cChatPanel\u003e();\n        _chatPanel.chatLogText.text = \"\";\n        _chatPanel.inputField.onEndEdit.AddListener(OnChatInput);\n        _chatPanel.inputField.ActivateInputField();\n    }\n    \n    private void Connect()\n    {\n        CreateChatPanel();\n\n        _client = new Client();\n        _client.Start(ip, port);\n        _client.OnMessageReceived   += MessageReceived;\n        \n        _handler = new MessageHandler();\n        _handler.AddHandler(\"chat\",     HandleChatMessage);\n        _handler.AddHandler(\"greet\",    GreetHandleMessage);\n    }\n\n    //  event callbacks\n    private void MessageReceived(byte[] msg)\n    {\n        _handler.Handle(msg);\n    }\n\n    private void OnChatInput(string input)\n    {\n        if (!string.IsNullOrEmpty(input) \u0026\u0026 !string.IsNullOrWhiteSpace(input))\n        {\n            var chat = new ChatData()\n            {\n                author = _clientNickname,\n                entry  = input\n            };\n\n            var msg = new Message()\n            {\n                header = \"chat\",\n                body   = chat.Serialize()\n            };\n\n            _client.Send(msg.Serialize());\n\n            _chatPanel.inputField.text = \"\";\n            _chatPanel.inputField.ActivateInputField();\n        }\n    }\n\n    private void OnApplicationQuit()\n    {\n        _client.Disconnect();\n    }\n\n    //  handlers\n    private void HandleChatMessage(byte[] data)\n    {\n        var chat = data.Deserialize\u003cChatData\u003e();\n        _chatPanel.AddLog(chat.author + \": \" + chat.entry);\n    }\n\n    private void GreetHandleMessage(byte[] data)\n    {\n        var greet = data.Deserialize\u003cGreetData\u003e();\n        _chatPanel.AddLog(greet.greetMessage);\n        _chatPanel.AddLog(\"Connection id: \" + greet.id);\n    }\n}\n```\n\nFinally, `ThreadManager` is responsible for executing on main thread. \nFurther info here,\nhttps://stackoverflow.com/questions/41330771/use-unity-api-from-another-thread-or-call-a-function-in-the-main-thread\n\n## Closing words\n\nWhen I search for this topic, I saw so much discussion about unity, \nold and new unity network stack and it's server capabilities.\n\nAlso, in this forum thread, Joachim Ante(CTO, Unity) gives detailed answers to some good questions.\n\nhttps://forum.unity.com/threads/dots-netcode-for-mmorpg.867463/\n\nAt this point, would I use a custom homebrew server from scratch in my in-production game?\n\nWell if I need to fill my custom needs, I would bet my money on Telepathy and it's aproach to solve unity bounds and\nbattle tested codebase. Here some detailed info on this topic from the author,\n\nhttps://mirror-networking.com/apathy/\n\nhttps://github.com/vis2k/Telepathy\n\n\n## Referenced resources\n[Telepathy](https://github.com/vis2k/Telepathy)\n\n[SimpleUnityTCP](https://github.com/EricBatlle/SimpleUnityTCP)\n\n[Tom Weiland unity network series](https://www.youtube.com/watch?v=uh8XaC0Y5MA\u0026list=PLXkn83W0QkfnqsK8I0RAz5AbUxfg3bOQ5)\n\n[Facepunch.Steamworks](https://wiki.facepunch.com/steamworks/Creating_A_Socket_Server)\n\n\n## LICENCE\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemuka%2Funitysimpletcpnetwork","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcemuka%2Funitysimpletcpnetwork","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemuka%2Funitysimpletcpnetwork/lists"}