HTML5技术

急急如律令!火速搭建一个即时通讯系统!(附源码分享——高度可移植!) - CXLian

字号+ 作者:H5之家 来源:博客园 2016-01-26 18:01 我要评论( )

人在外包公司,身不由己!各种杂七杂八的项目都要做,又没有自己的技术沉淀,每次涉足新的项目都倍感吃力,常常现学现卖,却不免处处碰壁!当然,话说回来,也是自己的水平有限在先,一马配一鞍,无奈也只能留在外包公司。 这不,就在上一周,领导下达一个任

      人在外包公司,身不由己!各种杂七杂八的项目都要做,又没有自己的技术沉淀,每次涉足新的项目都倍感吃力,常常现学现卖,却不免处处碰壁!当然,话说回来,也是自己的水平有限在先,一马配一鞍,无奈也只能留在外包公司。

      这不,就在上一周,领导下达一个任务:3天内搭建一个即时通讯系统,与原有的办公系统集成。

      我正心里犯嘀咕;“网络编程自己就只知道一点皮毛啊,还是大学选修课上听老师讲的那一点东西,别说即时通讯了,以前也就只照着书上的例子写过一个抓包工具当作业交过,彻头彻尾的小白啊,何况都毕业几年了,连“套接字”都快忘了!”

      领导补充说:“这个即时通讯系统要尽快完成,之后还有别的的项目。”

      我:“······好的”

      没办法,就像领导常说的“有条件要上,没有条件创造条件也要上!”,临危受命,唯有逆流而上!

      想都别想,写即时通讯总不能从socket写起啊,那样写出来的东西只能读书的时候当作业交给老师看下,然后记一个平时成绩,给领导看那就是找抽!

      所以,只能“登高而招,顺风而呼”,园子里大神多,资源也多,找找看有没有可以参考的。(这也是我一直以来的工作方法,呵呵)

     

      言归正传,接下来就把自己的学习所得以及编写过程详尽的分享给大家!

 

一·界面快照

    

   

     

    

    

 

二·网络消息流与通信协议

     首先,网络中的数据是源源不断的二进制流,有如长江之水连绵不绝,那么,即时通讯系统如何从连绵不绝的数据流中准确的识别出一个消息呢?换言之,在悠远绵长的网络数据流中,一个个具体的消息应该如何被界定出来呢?

     这就需要用到通信协议。通信协议,一个大家耳熟能详的术语,什么TCP啊、UDP啊、IP啊、ICMP啊,以前学《计算机网络》时,各种协议充斥寰宇。但是,从教科书上抽象的概念中,你真的了解什么是通信协议吗?

     回到开始的问题,我想恐怕可以这样来理解:通信协议就是要让消息遵循一定的格式,而这样的格式是参与通信的各方都知晓且遵守的,依据这样的格式,消息就能从数据流中被完整的识别出来。

     通信协议的格式通常分为两类:文本消息、二进制消息。 

     文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束。这样一来,根据这个特殊的标志符,每个消息之间就有了明确的界限。 

     二进制协议,通常是由消息头(Header)和消息体(Body)构成的,消息头的长度固定,而且,通过解析消息头,可以知道消息体的长度。如此,我们便可以从网络流中解析出一个个完整的二进制消息。
     两种协议各有优劣,虽然文本协议比较简单方便,但是二进制协议更具有普适性,诸如图片啊、文件啊都可以转化为二进制数组,所以我在写即时通讯时采用的是二进制协议。

     我定义的二进制协议是:消息头固定为8个字节:前四个字节为一个int,其值表示消息类型;后四个字节也是一个int,其值表示消息体长度。

     先来看消息头的定义 

MsgHead 2 { messageType; 消息类型 MessageType 8 { 9 get { return messageType; } 10 set { messageType = value; } 11 } bodyLength; 消息体长度 BodyLength 18 { 19 get { return bodyLength; } 20 set { bodyLength = value; } 21 } HeadLength = 8; MsgHead(int msgType,int bodyLen) 27 { 28 this.bodyLength = bodyLen; 29 this.messageType = msgType; 30 } [] ToStream() 33 { [MsgHead.HeadLength]; 35 byte[] bodyLenBuff = BitConverter.GetBytes(this.bodyLength); 36 byte[] msgTypeBuff = BitConverter.GetBytes(this.messageType); 37 Buffer.BlockCopy(msgTypeBuff, 0, buff, 0, msgTypeBuff.Length); 38 Buffer.BlockCopy(bodyLenBuff, 0, buff, 4, bodyLenBuff.Length); 39 return buff; 40 } 41 }

View Code

    然后我们将识别消息的方法封装到一个协议助手类中,即收到消息的时候,明确如下两个问题:1.固定前多少位是消息头。2.如何从消息头中获取消息体长度。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • vue2.0版cnode社区项目搭建及实战开发 - sandisen

    vue2.0版cnode社区项目搭建及实战开发 - sandisen

    2017-04-20 14:00

  • net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探 - 失足程序员

    net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探 -

    2017-04-02 10:11

  • Ionic2 开发笔记(1)ionic2 +angular2搭建 - 早上~得~喝粥

    Ionic2 开发笔记(1)ionic2 +angular2搭建 - 早上~得~喝粥

    2017-03-13 16:00

  • React+webpack开发环境的搭建 - 雨和雪

    React+webpack开发环境的搭建 - 雨和雪

    2017-03-11 09:05

网友点评