工作碰到的一个问题,分享一下解决方案。
使用java开发一个socket服务器,使用protocol buffer作为和客户端通信的数据格式。然后,问题就来了,这个socket服务器要如何调试?换句话说,服务器上的程序要怎么样才能跑出实际的效果。
如果开发的是一个web服务器,那么借助浏览器就能运行服务器上的程序,如果是get请求类型的程序,在浏览器地址栏里输入服务的地址,按回车即可;如果是post请求类型程序,使用postman之类的chrome插件亦能轻松完成任务。
如果开发的是一个纯粹的socket服务器,也有众多软件可以模拟客户端向服务器发送数据,如sokit。
如果客户端和服务器使用json作为通信的数据格式,那么也很好办, json是一串可视化的字符串,可以轻而易举的构造出来。
然而,protocol buffer格式的数据并不容易构造,它是一种特定格式的二进制数据,没有办法通过键盘键入字符构造出来,也没有办法通过将字符串经过通用的算法加工构造出来,要构造出protocol buffer数据要使用特定的协议文件和复杂的工序,不存在一个拿来即用的通用调试工具。
要执行利用protocol buffer作为数据传输格式的服务器需要编写特定的代码,与服务器对应的客户端就具有这个能力。可是客户端和服务器是由不同的人开发的,如果我在服务器上每开发一个功能都需要客户端的同事帮忙调试,这效率也太低了,做web开发都有前后端分离的概念,未必游戏开发就没有了。
所以我需要自己模拟一个客户端来和服务器通信。
可开发一个这样客户端工作量太大,因为我们的服务器核心通信部分完完全全一行一行代码写出来的,协议是定制的,这也就意味编写的客户端要和服务器交互也需要实现这套协议,虽然有现成的代码可以参照,要完成任务还是异常困难。
完成这项工作的唯一捷径是复用服务器的代码,我原本打算用c# + wpf做这件事,开发windows客户端这两种技术是首选,可重复实现轮子是个问题。这个时候java的跨平台的威力就显现出来了, java也可以开发windows客户端程序,此外他还有一项优势,可以复用服务器端的java代码和jar包,然后我直接将服务器端的协议实现代码和ptotocol buffer数据结构定义代码拷贝到客户端项目里,流程就直接跑通了,问题迎刃而解。java虽然又老又丑,但不得不承认,姜还是老的辣。
另外用java做客户端程序还有一个牛逼的框架,JavaFx。它使用xml 作为界面布局文件,当然,这个不稀奇,现在众多流行的客户端开发技术都用xml布局页面。然而,神奇的是,它还可以使用css设置界面样式,这个就逆天了,它让开发客户端程序和开发web一样容易。
这使得我无门槛毫不费力第一次就轻松的完成了一个不算太丑的java windows 客户端程序开发
这个客户端会将模拟用的json数据转换成protocol buffer数据并使用特定的协议发送给服务器,服务器上的程序便能运行,原本这个过程的的实现需要客户端开发的同事的帮助才能完成,所以它为我简化了开发过程,提升了工作效率。当前,我可以自己开发调试服务器,除了联调时刻,其余任何时候都不用依赖客户端。
java这玩意,虽然年纪大,长得不好看,有时候还有点笨手笨脚,可解决问题的关键能力还是要比那些长得好看的小鲜肉编程技术可靠的多。