第七十四章 再改豌豆射手

表面上,韩海是进入了修炼,其实他是打开了数据模型库,观察起来这次的收获,他记得在杀死李易龙后,数据模型仓库传来响声,是有东西入库了。

韩海在仓库中找寻了半天,终于找到了新增的这个数据模型,这是一张白色的卡片,卡片中央写着SYSTEM,而在卡片偏上的位置写着socket.io,当看到这个模型的时候,韩海的心情非常愉快,这个数据模型明显是一个系统的类库,而且它的功能也是非常强大的。

可以说句毫不夸张的话,如果没有socket,那么互联网就不存在。

没错socket就是网络传输中嵌套字协议,这种协议说白了就是给你一个定量字节的传输空间,负责电脑终端间连线的一种协议方案。

而目前大规模应用于浏览器的协议,就是基于TCP长连接开发出的http协议,这是一种短连接的协议,原理很简单一次请求一次返回,然后就断开连接,而大家使用的聊天软件,大部分是使用TCP长连接协议作出的软件。

韩海现在拥有了socket系统库后,就可以编写一套IM系统,也就是及时聊天系统(Instant Messaging),这样也就可以解决团队协作中,通讯不方便的问题。

末日之后因为电力设施都被怪物破坏或者失去维护,各种移动终端都失去了作用,现在大家通讯全靠吼,这对于信息的传播非常不利,而当韩海有了这一套socket系统库后,他就可以基于自己的系统开发出多人聊天的软件了。

而且开发出这种软件后,韩海不仅仅可以自己人使用,也可以贩卖给其他人使用,并且赚取钱财,这样既方便了自己敛财,又给社会提供了服务,一举多得。

韩海想到这里,不禁笑了笑,随后韩海新建了一个项目,然后又新建了6个文件夹,分别是protocol、common、core、server、main、utils,这些文件夹对应了协议模块、通用模块、核心模块、服务模块、主函数文件夹、工具类存放文件夹。

这一次韩海编写的是一个稍微大些的项目,其中使用字符数,他预计估计了下,起码要使用20-30万之多,也就是要耗费20-30万字符能量,可见一个聊天系统的服务器实现的难度,并且写完服务器韩海还需实现客户端的编写,这里也需要耗费大量的字符能量。

不过在守城战后,韩海字符能量达到了200万,目前来说还是够他挥霍的,所以他目前不必为字符能量担忧。

然后韩海开始了漫长的编写,不过好在的是,聊天系统他之前在公司的时候写过一套,现在也能回想起来,复写一遍就好了。

韩海所写的及时聊天系统,主要分三层:协议层、功能层和业务层。

协议层主要是定义服务器和客户端传输数据包时候的约定,这一层还分2层,第一块是通讯协议层,第二块是业务协议层。

通讯协议层:主要是通用化的加密解密方案,握手、重连、断开等约定。

业务协议层:主要是处理某个用户要与某人通讯,然后给某人发出消息,断开等等约定。

协议说白了也算一种数据结构,只不过他们传播的方式是流状的,而代码去解析也需要逐步去解析,就好比写信的时候,我要告诉你一件事情,但是我雷打不动,信的第一行写的肯定是你的名字,后面才跟着是我写给你的内容。

当然没有写信那么简单,我们可能在主消息体前面加了很多标示,就像之前所说的,第一层用两个字节使用IM标识,这个是属于这个通讯系统的占位符,第二层用四个字节传入了一个时间,第三层用1个字节传了一个短整形7,标识这个文本的业务是传输消息,第四层用了四个字节放了一个长整形标识之后消息体的字节长度,第五层才能使用刚刚读到的消息体长度,才可以拿到定长的消息体。

在这之后,还需要解码消息体,得到真正的消息,不过这个东西一般写在客户端,服务器只负责传输就好了。

当然以上的描述只是个栗子,而真正应用中比这些数据更多、更复杂,比如一个用户传递消息给另一个用户,如果要交给另一个用户,不仅服务器要识别这个消息体发送人的身份,还要识别传递给那个人的是否存在,能不能发送等等。

功能层主要就是进行数据的一些处理,比如以下代码:

int encodeLong(long long int src,unsigned char **ret,int &len)

{

unsigned char *buf =(unsigned char*)malloc(9);

memset(buf,0,9);

unsigned char *p = buf;

*p++|= LPUSH_FMT_LONG;

*p++|=(src>>56)&0xFF;

*p++|=(src>>48)&0xFF;

*p++|=(src>>40)&0xFF;

*p++|=(src>>32)&0xFF;

*p++|=(src>>24)&0xFF;

*p++|=(src>>16)&0xFF;

*p++|=(src>>8)&0xFF;

*p++|=(src)&0xFF;

len = 9;

*ret = buf;

return 0;

}

这段代码的作用就是把一个长整型的数据封装进入字节流,并且字节流的首地上返回给二级指针。

业务模块就好理解很多了,比如转发一个客户端传递来的消息,通过用户id的标示找到相应的用户,再从用户注册在服务器的消息找到相应的客户端,然后把消息通过socket传输给另外的客户端。

韩海花了整整半夜才完成了服务器的编写,要不是很多东西他都写过,也不可能这么快,一个新手如果写一个聊天服务器,从入门到上手就需要一个月,当然新手是指的工科毕业生的水平。

接下来该编写客户端了,客户端和服务器就不同了,客户端需要一个载体,这个韩海早想到了,这个时候豌豆射手的攻击,已经无法破开普通丧尸的防御了,所以韩海准备把它改成通讯工具,想想大家每人肩膀上一个豌豆射手,然后对着它的炮筒通话是中什么样的画面。

韩海一想到这个,就感觉有无穷的动力,作为一个理工男的恶趣,还真不是一般人可以理解的。

韩海回了回神,打开了豌豆射手的数据模型,然后开始了长时间的阅读,这一次因为还是改写炮筒攻击方位的模块,所以他是有操作权限的。

但是这一次韩海需要大改这个模块的函数了,因为韩海要把攻击的功能,完全改写成一个收听声音和播放声音的组建,好在豌豆射手天生有听觉模型,并且在炮筒上也长着嘴巴,韩海只需要把这两样功能模块,进行取样和转发就可以了。

到了这一步,韩海就必须使用钩子技术了,他一共编写了2个篡改函数,因为函数的原型韩海可以看到,所以篡改以后的函数可以无缝对接原来的功能,从而不影响以前的程序。

第一个篡改的是豌豆射手收听声音的函数,他只不过是从中截取了每一帧声音的数据。

第二个篡改的是豌豆射手发声的函数,这一次他需要在发出声音的队里中,加入自己从socket收到的声音数据。

豌豆射手声音的样板是标准的PCM,也就是Pulse Code Modulation,即为脉冲编码调制。

在光纤通信系统中,光纤中传输的是二进制光脉冲“0”码和“1”码,它由二进制数字信号对光源进行通断调制而产生。而数字信号是对连续变化的模拟信号进行抽样、量化和编码产生的,称为PCM(Pulse-code modulation),即脉冲编码调制。

而这种样本数据一般数量级比较大,不利于传输,所以韩海使用了一个通用压缩标准AAC进行编码传输,AAC即是高级音频编码(Advanced Audio Coding)。

目前韩海可以粗略的实现AAC的编码步骤,这种压缩编码算法是有损失的算法,原理采样一段时间内的PCM数据,然后使用傅里叶变幻编解码,声音其实就是不同频域的振幅,叠加起来的正弦波,编码算法其实就是进行时域正弦波叠加成近方型的正弦波,而解码就是使用傅里叶反变换,把叠加正弦波解码成原来一段段的正弦波。(这里只是粗略的进行编解码)

再之后的步骤,把压缩后的音频向服务器进行发送就可以了,再由服务器转发到另外的客户端,当客户端接收到音频消息的时候,再运行篡改后的发声函数,这样就达到了通讯的目的。

当然客户端也必须建立一套身份标识,否则通讯就无从寻找联系人了,这一点韩海已经想到了,当建立模型的时候,韩海可以给每个豌豆射手设置一个数字号码,当有人想要通讯的时候,在豌豆射手上拨号就可以了,而且系统内部还建立的群组概念,其实就是聊天群,联系人可以在群里发信息与群组内的所有人通讯。

之后韩海还编写了一套聊天界面,他把豌豆射手一侧绿色的表皮,变成动态的屏幕,这样用户就既可以发送声音也可以发送文字了。(参考QQIM)

目前韩海并没有开发视频聊天的功能,因为视频的编码比起声音来说复杂了不止一点,这是他以前学习中所欠缺的内容,这需要他再学习下H264视频编码后才可以实现,所以这里他留下了一个扣子,只有等以后再改进了。

做完这些,韩海把socket连接的函数写好,然后仔仔细细观察起写好的代码来,这是他许久以来养成的习惯,没有一个程序员,敢说自己写的程序没有BUG,如果有人说了,那么只是他没发现而已。

没一会儿,韩海又修改了几处地方,然后仔仔细细再看了一遍,直到发现不了问题后,他才送了一口气。

在这个时候,他才感觉到一股困意袭来,显然大量代码的编写,耗费了他大量的精力,这使得他心中一惊,因为明天还有事情做,想到这里他不敢怠慢,开始放空自己的脑袋,真正不去思想东西,这才沉沉的睡了过去。

第一百零四章 战商圣杰(1)第一百四十六章 盘古尊第四十九章 杀水怪第一百五十三章 进城第七十三章 青帮灭、隋商逃第十三章 颖立第三十二章 大水冲了龙王庙第八十二章 章龙VS商圣杰第四十七章 变异鼠群VS韩海的宠物第三十五章 动态库?第三章 便利店遭遇第一百三十二章 一个演员的自我修养第七章 亡灵法师第一百七十三章 等消息第四十八章 DELETE第七十四章 再改豌豆射手第一百一十四章 监牢中的日子(1)第一百二十二章 经源到手第一百五十九章 血脉醒,空间眼第八十章 灭虫计划-灭杀第九十五章 隋商第一百四十八章 继续找路第一百八十一章 抱着就跑第六章 可以行走的豌豆射手第一百八十七章 殊归同路第三十五章 动态库?第二十五章 全要了第三十五章 动态库?第八十三章 科加斯数据模型第一百五十七章 学习《引源术》下第二十五章 全要了第二十七章 双龙会史辉第一百零二章 东城区的新况第七十二章 双龙会灭第一百八十八章 殃及鱼池第九十六章 隋商再跑,韩海欲屠龙第四十七章 变异鼠群VS韩海的宠物第一百四十二章 拖延第一百零五章 战商圣杰(2)第三十五章 动态库?第十九章 加入车队第一百八十七章 殊归同路第一百八十七章 殊归同路第一百零九章 启程第二十一章 石城第一百三十三章 毛骗第七十七章 虚空恐惧第六十三章 B级变异兽第一百零五章 战商圣杰(2)第二十二章 分离第一百二十三章 跑第一百八十章 记忆总是让人感叹第九十五章 隋商第一百七十八章 貌似好像,还是打不过第一百三十三章 毛骗第一百四十九章 交易第四十九章 杀水怪第七十九章 灭虫计划-布局、引诱第一百四十三章 战布兰德第十七章 蚁后第一百八十八章 殃及鱼池第四十八章 DELETE第一百三十四章 飞剑以备第五十九章 连夜戮战第一百九十一章 次空间引擎第十一章 舔食者第九十八章 苏醒与可怕的疗伤第三十五章 动态库?第十二章 暴君第三十五章 动态库?第四十六章 远程小兵(LOL)第五十二章 职业者大会第八十六章 擂台、屠宰场第二十六章 修改太极清气数据模型第一百八十九章 虚与委蛇第一百一十五章 监牢中的日子(2)第一章 末日来临第一百一十二章 遭遇刺杀第一百七十三章 等消息第二十五章 全要了第四十四章 水怪第七十一章 顶级对决第一百六十四 破法第八十五章 拒绝第八章 黑暗中的竞技第一百五十八章 各方反应第九十一章 店铺开张第一百五十八章 各方反应第八十二章 章龙VS商圣杰第七十七章 虚空恐惧第一百零四章 战商圣杰(1)第七十八章 灭虫计划-试探第六十七章 狂欢?第一百三十四章 飞剑以备第一百四十二章 拖延第一百四十一章 程序都是有后门的第五十一章 发展与黑雨第三十三章 范宇第一百二十六章 找路