{"id":45893044,"url":"https://github.com/beykery/cocosocket","last_synced_at":"2026-03-13T06:00:53.255Z","repository":{"id":13048008,"uuid":"15728035","full_name":"beykery/cocosocket","owner":"beykery","description":"cocosocket是一个为高性能网络通信准备的底层通信框架，满足对于高性能网络通信的需求，适用于基于tcp或kcp的应用开发。","archived":false,"fork":false,"pushed_at":"2020-02-25T13:34:07.000Z","size":18829,"stargazers_count":187,"open_issues_count":3,"forks_count":81,"subscribers_count":36,"default_branch":"master","last_synced_at":"2023-10-20T18:13:09.428Z","etag":null,"topics":["c-sharp","game-development","java","kcp","moba","moba-kcp","socket"],"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/beykery.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}},"created_at":"2014-01-08T06:55:42.000Z","updated_at":"2023-10-08T16:00:48.000Z","dependencies_parsed_at":"2022-09-08T12:11:05.021Z","dependency_job_id":null,"html_url":"https://github.com/beykery/cocosocket","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/beykery/cocosocket","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beykery%2Fcocosocket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beykery%2Fcocosocket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beykery%2Fcocosocket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beykery%2Fcocosocket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beykery","download_url":"https://codeload.github.com/beykery/cocosocket/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beykery%2Fcocosocket/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30459760,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T03:55:51.346Z","status":"ssl_error","status_checked_at":"2026-03-13T03:55:33.055Z","response_time":60,"last_error":"SSL_read: 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":["c-sharp","game-development","java","kcp","moba","moba-kcp","socket"],"created_at":"2026-02-27T19:00:39.315Z","updated_at":"2026-03-13T06:00:53.249Z","avatar_url":"https://github.com/beykery.png","language":"C#","readme":"# cocosocket  \n\n\ncocosocket是一个为cocos2d-x和unity 3D手机网络游戏准备的底层通信框架，满足网络游戏客户端\n对于高性能网络通信的需求，适用于基于socket的手机网游。\n\n## 问题\n\n开发cocos2d-x网络游戏其中一个重点是书写稳定可靠的socket通信层。而bsd socket是\n一个c语言的函数库，使用起来颇繁琐（beykery不喜欢），我们需要一个稳定可靠并且\napi又足够简洁的通信层。它需要具备建立连接读写基本类型（byte、short、int、long、\nutf8字符串）的能力、可灵活设计通信协议（分帧、处理粘包）的能力；它还需要运行在\n独立于游戏主线程的线程里、网络事件（建立、关闭、异常、包到来等）发生时回调监听\n器。或许我们还有同步的需求假如我们把收到的包放到一个待处理队列（queue）里面，\n而游戏主线程需要访问这个队列。\n\n## 解决方案\n\ncocosocket在bsd socket基础上实现了一个简洁优雅的c++的api，除了线程、线程池、\n队列、套接字（socket）、套接字监听器（socketlisterner）外，重要的是还提供了\n一种自定义通信协议的api（Protocal），并提供了一个基于lengthfield的协议实现\n（推荐使用lengthfield）；cocosocket提供了基本数据类型的读写api，而这些读写\n是按照网络流（big endian）顺序处理的。\n\ncocosocket还拥有关于锁、队列、同步队列、线程池的实现，这些内容有些不是必须的\n，但我想也会有助于扩展功能。\n\n## 使用\n\n使用cocosocket是很简单的，看下面代码：\n```java\n    Socket* s = new Socket();//1\n    SocketListerner* sl = new DefaultListerner();//2\n    s-\u003eSetListerner(sl); //3\n    s-\u003eSetProtocal(new LVProtocal());//4\n    s-\u003eConnect(\"192.168.1.100\", 3333);//5\n```\n是的，就是这么使用，我将分别介绍这几行代码及其背后的机制\n\n1，初始化一个Socket对象。\n\n2，3，两行初始化一个SocketListerner并设置，这个listerner就是socket各种事件的\n的回调接口，需要用户根据自己的需求实现一个SocketListerner（继承它），这个监听\n器会处理这几个事件：socket连接成功（OnOpen）、socket连接关闭（OnClose）、消息\n到来（OnMessage）、连接超时（OnIdle）、连接异常（OnError）；这些方法的回调，\n是独立于游戏主线程的，因为socket运行在一个独立的线程里。DefaultListerner仅仅\n是beykery用来测试的，使用cocosocket的时候，需要你自己定制自己的listerner。\n\n4，初始化一个Protocal并设置为socket的分帧协议。分帧是这样的，由于发送方（服务\n器）发送的消息是一个不间断的流，因此我们需要从这个流里面分析出一个个帧（代表\n某种逻辑意义）出来，换句话说，就是我们要找到每一帧的起始和终止位置并提取出来\n。举个例子：服务器发送两帧数据过来,AB和CD，客户端接收的情况就很复杂，有可能是\n先收到A，然后收到BCD；也有可能是先收到A，然后收到B，最后收到CD；等等等等复杂\n情况，显然，我们的逻辑要求AB是一个逻辑单位（帧），CD是一个逻辑单位，如果按照\n每次收到的信息作为一帧，则无法处理业务逻辑。\n\n接下来看看LVProtocal，这个类继承了Protocal，它实现的分帧逻辑是这样的：先读取\n两个字节，组合为一个两字节整数x，接下来会读入x字节的数据，如果当前数据较少，\n则有多少读入多少；否则读入x字节。读完整x字节后，则一帧数据读完，之后SocketListerner\n的OnMessage将会被调用。\n\n如果你想要使用不同的分帧逻辑，则需要自己实现一个Protocal。建议使用LVProtocal\n，因为这个只是分帧的逻辑，分完帧以后，也就是分出来的x字节，它的内容，就是我们\n的业务协议的内容了，可能是一个字符串，或者按照某种特定顺序组织的（比如先两个\n字节的整型代表协议号，然后八个字节是一个长整形表示用户的id，然后。。。），当\n然也有可能这x个字节是经过某个加密算法加密过的，那么需要解密后再按照业务协议来进\n行解析。\n\n5，连接服务器，需要指定服务器ip地址和端口，如果连接成功，则SocketListerner的\nOnOpen函数会被调用，如果失败OnClose将被调用。\n\n## 关于cocosocket-server\n\nserver部分是一个java程序，其底层依赖于netty，netty是一个真正高性能的通信框架\n，cocosocket-server隐藏了许多netty的复杂性（netty不仅仅用于tcp/ip协议的通信）\n，如果跟cocosocket-client作对比你会发现，他们的api很相似，这在某种程度上简化\n了理解这两者的难度，你可以从server端或client端入手，这将非常有助于理解另一端\n。坐标：\n```xml\n  \u003cdependency\u003e\n      \u003cgroupId\u003eorg.beykery\u003c/groupId\u003e\n      \u003cartifactId\u003ecocosocket\u003c/artifactId\u003e\n      \u003cversion\u003e1.1.1\u003c/version\u003e\n  \u003c/dependency\u003e\n```\n## 关于cocosocket4unity\n\n这个程序是为unity 3D准备的，api和c++版本的客户端很像，实现的是相同的功能，适用\n于unity 3D网游。里面我嵌入了litjson的代码用并修复了它的一个bug：utf8字符串乱码\n，如果你刚好需要json解析，那么建议使用，否则请删去litjson的代码即可。\n\n## 关于kcp\n\ncocosocket4unity工程里面集成了一个kcp的c#实现，适用于moba类网游的开发，关于kcp\n更多的技术细节请参考\n[kcp](https://github.com/skywind3000/kcp)\nkcp的java版本，请参考\n[jkcp](https://github.com/beykery/jkcp)\n\nkcp是一种独立于底层通信协议的重传算法，而cocosocket4unity里面的c#实现和jkcp，\n不同于kcp的是直接构建在udp之上并提供完善的编程接口，用户不用关心udp和kcp的\n使用细节就能轻松驾驭moba类等需要高速传输环境的应用开发。\n\n## 结语\n\nok，那么我想你现在应该对cocosocket有个大概了解了。enjoy it.\n\n\t\n\t\n","funding_links":[],"categories":["网络编程"],"sub_categories":["Spring Cloud框架"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeykery%2Fcocosocket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeykery%2Fcocosocket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeykery%2Fcocosocket/lists"}