这篇文章是上一篇文章grpc简介的后续,是我在使用grpc的过程中所遇到的一些问题和解决方案。
版本问题
前情提要:原先根据第一版本的接口文件生成的grpc客户端和grpc服务端已经能够通信正常。后来接口文件有改动,我所负责的grpc客户端是根据新版接口文件生成的,与原先的grpc服务端通信,发现并不能正常通信。
解决办法
查找大量资料后发现,
grpc实现跨语言通信,proto文件要完全一样
。而grpc服务端还是原先旧版的接口文件生成的,又因为我们是跨语言通信(grpc客户端是c++语言,grpc服务端是c#语言)。最终用新版的接口文件生成新版的grpc服务端,能正常通信。
客户端流
开启写线程,在需要将对应数值发送的地方,通过addspeed函数,加入到队列中。而while循环里,根据队列是否为空来判断是否要继续给grpc服务端发送数据。如果队列为空,则表示目前没有数据需要发送,若队列不为空,则发送队列中最前面的数据,如果发送成功,则将最前面的数据pop出来,如果发送失败,则不会pop出来,会继续再发送,直到该数据发送成功。
服务端流
开启读线程。通过while循环不停的用reader->Read()去获取服务端传过来的数值。如果没有什么条件判断,可以直接将
reader->Read()替换gamestatus.load() == Gamestatus::playing
。我这边是因为只有在游戏进行中,才会去获取服务端的值,如果游戏状态为游戏已结束则不需要浪费资源去不停的获取。