|
发表于 2013-10-4 00:18:27
|
显示全部楼层
“Socket点对点通信的原理”,客户端群聊、客户端和服务端通信都已成功了
其实你已经做了点对点通信呀.
客户端对服务端就是1对1的关系(单播),群聊是1对多.(广播)
通讯原理就是基于TCP的无边际面向连接的关系进行传输,啥叫无边际面向关系?通俗点说就是+-无穷..
TCP很负责任,经过3次握手后开始传送报文消息,在报文中自定义去规定消息边际,说白了就是自己规定一条报文有多长,
一条报文包含什么内容,一条报文包含的内容是否正确.对报文中的内容是否需要转义.
举个例子给你,
报文格式如下(0x):
0x9e 9527 0001 1310040002 123456 0x18 3c 0x9e
说明:
0x9e 分别是头尾,用来区分一条报文的头,尾,方便截取数据
9527 报文自定义协议头(我随便写的,目的就是为了区分这条报文的作用,如果报文比较多的情况下)
0001 当前报文流水号.(目的:传输回应后所要应答的消息.)
1310040002 当前时间
123456 传送的消息内容.(****本来因该都是16进制,这里直接用10进制书写,比较容易阅读.传输时因该所有都是以16进制传输)
0x18 代表从协议头到协议尾的长度,10进制则为24
3c 代表数据校验.从9527一直到0x18 对其进行异或校验(我个人常用这种校验方法来校验数据的完整性)
假设上方报文是客户端发送来的.
服务端接收时:
判断首尾是否都是0x9e,若不是,抛弃.
从9527 开始到0x18,进行数据(异或)校验,若不是3C,抛弃.(后期一般发现包体不正确,获取到0001,要求客户端重新发一条包)
若以上都通过,则解出报文内容.然后根据自定义协议开始通讯.比如我回一条654321
0x9e 09527 0001 1310040012 654321 0x18 3c 0x9e
客户端自行解包,与服务端一样的判断(09527代表对9527的回应,具体回应则为0001).取出654321 在继续通信.
说白了就好比找人一样.你在一个班级找某人,你在门口大喊,谁是XXX(你不知道XXX是谁,只有发送一条所有人都知道的信息.这就是广播.)
当你知道谁是XXX了,你会问:"你是 XXX?";对方答"yes";你收到"yes后开始传递消息.";XXX收到消息后给你响应.这就完成了一次通讯.提到这里不得不提下心跳包.心跳包就是保持连接的机制.CLR会自动回收对象,当socket没有通讯时,他默认认为这个连接挂断了,所以会自己回收资源.一般写程序都会有个超时应答时间,一般认为30秒没有接收到心跳包就认为shutdown(下线).发送一条下线报文,如果有应答,心跳继续,如果超过定义应答次数还是没应答,就自己讲这次连接释放吧.
havefun...{:soso_e113:}
by Ro4ters
|
|