81 Star 142 Fork 68

beykery / cocosocket

Create your Gitee Account
Explore and code with more than 12 million developers,Free private repositories !:)
Sign up
Clone or Download
contribute
Sync branch
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md
Apache-2.0

cocosocket

cocosocket是一个为cocos2d-x和unity 3D手机网络游戏准备的底层通信框架,满足网络游戏客户端 对于高性能网络通信的需求,适用于基于socket的手机网游。

问题

开发cocos2d-x网络游戏其中一个重点是书写稳定可靠的socket通信层。而bsd socket是 一个c语言的函数库,使用起来颇繁琐(beykery不喜欢),我们需要一个稳定可靠并且 api又足够简洁的通信层。它需要具备建立连接读写基本类型(byte、short、int、long、 utf8字符串)的能力、可灵活设计通信协议(分帧、处理粘包)的能力;它还需要运行在 独立于游戏主线程的线程里、网络事件(建立、关闭、异常、包到来等)发生时回调监听 器。或许我们还有同步的需求假如我们把收到的包放到一个待处理队列(queue)里面, 而游戏主线程需要访问这个队列。

解决方案

cocosocket在bsd socket基础上实现了一个简洁优雅的c++的api,除了线程、线程池、 队列、套接字(socket)、套接字监听器(socketlisterner)外,重要的是还提供了 一种自定义通信协议的api(Protocal),并提供了一个基于lengthfield的协议实现 (推荐使用lengthfield);cocosocket提供了基本数据类型的读写api,而这些读写 是按照网络流(big endian)顺序处理的。

cocosocket还拥有关于锁、队列、同步队列、线程池的实现,这些内容有些不是必须的 ,但我想也会有助于扩展功能。

使用

使用cocosocket是很简单的,看下面代码:

    Socket* s = new Socket();//1
    SocketListerner* sl = new DefaultListerner();//2
    s->SetListerner(sl); //3
    s->SetProtocal(new LVProtocal());//4
    s->Connect("192.168.1.100", 3333);//5

是的,就是这么使用,我将分别介绍这几行代码及其背后的机制

1,初始化一个Socket对象。

2,3,两行初始化一个SocketListerner并设置,这个listerner就是socket各种事件的 的回调接口,需要用户根据自己的需求实现一个SocketListerner(继承它),这个监听 器会处理这几个事件:socket连接成功(OnOpen)、socket连接关闭(OnClose)、消息 到来(OnMessage)、连接超时(OnIdle)、连接异常(OnError);这些方法的回调, 是独立于游戏主线程的,因为socket运行在一个独立的线程里。DefaultListerner仅仅 是beykery用来测试的,使用cocosocket的时候,需要你自己定制自己的listerner。

4,初始化一个Protocal并设置为socket的分帧协议。分帧是这样的,由于发送方(服务 器)发送的消息是一个不间断的流,因此我们需要从这个流里面分析出一个个帧(代表 某种逻辑意义)出来,换句话说,就是我们要找到每一帧的起始和终止位置并提取出来 。举个例子:服务器发送两帧数据过来,AB和CD,客户端接收的情况就很复杂,有可能是 先收到A,然后收到BCD;也有可能是先收到A,然后收到B,最后收到CD;等等等等复杂 情况,显然,我们的逻辑要求AB是一个逻辑单位(帧),CD是一个逻辑单位,如果按照 每次收到的信息作为一帧,则无法处理业务逻辑。

接下来看看LVProtocal,这个类继承了Protocal,它实现的分帧逻辑是这样的:先读取 两个字节,组合为一个两字节整数x,接下来会读入x字节的数据,如果当前数据较少, 则有多少读入多少;否则读入x字节。读完整x字节后,则一帧数据读完,之后SocketListerner 的OnMessage将会被调用。

如果你想要使用不同的分帧逻辑,则需要自己实现一个Protocal。建议使用LVProtocal ,因为这个只是分帧的逻辑,分完帧以后,也就是分出来的x字节,它的内容,就是我们 的业务协议的内容了,可能是一个字符串,或者按照某种特定顺序组织的(比如先两个 字节的整型代表协议号,然后八个字节是一个长整形表示用户的id,然后。。。),当 然也有可能这x个字节是经过某个加密算法加密过的,那么需要解密后再按照业务协议来进 行解析。

5,连接服务器,需要指定服务器ip地址和端口,如果连接成功,则SocketListerner的 OnOpen函数会被调用,如果失败OnClose将被调用。

关于cocosocket-server

server部分是一个java程序,其底层依赖于netty,netty是一个真正高性能的通信框架 ,cocosocket-server隐藏了许多netty的复杂性(netty不仅仅用于tcp/ip协议的通信) ,如果跟cocosocket-client作对比你会发现,他们的api很相似,这在某种程度上简化 了理解这两者的难度,你可以从server端或client端入手,这将非常有助于理解另一端 。坐标:

  <dependency>
      <groupId>org.beykery</groupId>
      <artifactId>cocosocket</artifactId>
      <version>1.1.1</version>
  </dependency>

关于cocosocket4unity

这个程序是为unity 3D准备的,api和c++版本的客户端很像,实现的是相同的功能,适用 于unity 3D网游。里面我嵌入了litjson的代码用并修复了它的一个bug:utf8字符串乱码 ,如果你刚好需要json解析,那么建议使用,否则请删去litjson的代码即可。

关于kcp

cocosocket4unity工程里面集成了一个kcp的c#实现,适用于moba类网游的开发,关于kcp 更多的技术细节请参考 kcp kcp的java版本,请参考 jkcp

kcp是一种独立于底层通信协议的重传算法,而cocosocket4unity里面的c#实现和jkcp, 不同于kcp的是直接构建在udp之上并提供完善的编程接口,用户不用关心udp和kcp的 使用细节就能轻松驾驭moba类等需要高速传输环境的应用开发。

结语

ok,那么我想你现在应该对cocosocket有个大概了解了。enjoy it.

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

为手机网游客户端(cocos2d-x和unity 3D)准备的通信底层,包括tcp和kcp。分帧逻辑采用lengthfield或varint32等,或自定义,解决粘包问题。 cocos2x-x部分已实现thread,threadpool,同步互斥锁等内容。 项目还包括一个synflood的简单实现。 expand collapse
C++ and 6 more languages
Apache-2.0
Cancel

Releases

No release

Contributors

All

Activities

Load More
can not load any more
C++
1
https://gitee.com/beykery/cocosocket.git
git@gitee.com:beykery/cocosocket.git
beykery
cocosocket
cocosocket
master

Search

F2647f8d 8189591 Bbdfb06e 8189591