我还是新手,JAVA、android、网路编程都没接触过。。。
老大给我个任务,让我把现有的jar的通讯库改成用C++写的,提供API给现在的unity3d游戏通信用。
我先大概了解了一些基础知识。现在好像是Unity3d->JNI->android jar这种层次结构,而且U3D也是可以调用dll的,那我想我只要把jar换成c++的DLL就行了把。。。
然后我就把jar反编译,看java的源代码打算把它翻译成C++的。。。
但是我现在还是很迷惑,我该用windows的socket头文件还是linux的呢?还是没啥区别?因为老大说这个通讯库以后还要用到IOS的游戏里。
我在想android是linux内核,应该调用unix的socket库吧,可是我是在windows环境用vc写的程序啊,调用unix库编译不了吧。。。哎,还是迷迷糊糊,只求大神们给我指点迷津
之前服务端一直在VS中去做,考虑到后面客户端与服务器一体化,就把服务端也在unity中实现了,需要注意的一点是,由于服务端中包含阻塞方法,而unity所有脚本都只在仅存的一个主线程中运行,所以如果直接在start中调用启动服务器的方法,unity会直接卡死的,所以我们就自己起一个线程去搞服务端部分,unity中起线程后要清楚两点:
1、monoBehavior类中的方法尽量别用了,会出现不可预知的bug。
2、自己起的线程,系统不会掺和,自己找个合适的地方再把他kill掉。
下面的代码是在程序结束时杀掉线程,想起以前老谢给我讲的,起线程就像拉屎,完事一定要记得自己擦,系统不会给你擦,经测试不擦第二次启动unity会无响应。
这一次代码里简单实现了从客户端发送一个字符串的包到服务端,服务端接收后并打印出来,代码全部贴出来:
版权声明:本文为博主原创文章,未经博主允许不得转载。 /qq_/article/details/
最近在研究网络同步,感觉很有意思。服务端与客户端都是用c#写的。很遗憾,现在的项目服务端都是用c++或者java写的。可能c#写出的效率不行?
socket通信协议我们通过知道的两种。一种是TCP协议,一种是UDP协议。TCP是以传输数据稳定而夺得游戏开发者的垂爱。UDP因为容易掉数据导致对于精准数据的传输方面被坐冷板凳,但是UDP的优点是传输速度快,适用于工业展示类数据传输。丢几个数据无所谓,反正是要对整体数据走势分析。
通常我们使用TCP协议。而TCP传输过程中会出现粘包分包问题。
当我们高频率传输一些小的数据时,TCP协议会自动将这些小的数据打包在一起发送出去,产生了所谓的粘包问题。这是TCP的内部优化。
当我们一次发送大量数据时,TCP会自动将数据切分多块然后分批次发送。
解决方法:我们在每次发送数据时,都要加上数据头。通常我们设定数据头为int32类型,占四个字节。数据头的内容表示我们发送的数据占了多少字节。这样我们对于粘包的数据,可以根据数据头对数据进行一步一步的解析读取。
首先我们需要创建一个message类来处理接收到的数据:
//用来存储接收到消息的数据 //开始往数组里添加数据的索引 因为可能存在分包的问题 所以startIndex不一定都是0 //有可能存在粘包 需要根据数据头来解析数据
//开始异步接收服务端发送过来的消息 我们需要创建一个message类来处理我们读取到的数据在服务器端用来管理连接服务器的客户端的Client类:
//这里用来中断客户端的断连 不然服务端要一直报错 //这里用来中断客户端的断连 不然服务端要一直报错 }在项目架构上,我们通常不会只发送头数据加字符串数据,根据项目需要我们也要加上我们的请求模块和响应模块。希望本博客能帮到你!