不过通信而已

我是菜鸟,但是基于我的自娱自乐,还是着眼于程序端的实现来谈谈我的通信。

简单讲,通信的目的就是将程序对外的数据交流准确无误地传递到另一个程序那一端。画个图来介绍数据处理的方式


程序内部数据处理         ···其他的数据处理····
IO流进行数据传递               最基础的byte流
物理层电脉冲实现         *****物理层的01串传递*******


既然是通信,就必然是两个程序之间进行数据的传递,这就要求通信的双方都实现了程序在同时运行。但是,在现实的通信中,我们都知道其实QQ的实现并不是两个客户程序之间进行直接的数据传递的,因为在通信双方不同时在线的时候我们还是可以实现信息的交流。要在两个不同时运行的程序之间实现通信其实也不是很复杂,这就牵扯到一个叫服务器的东西。这个东西存在的目的就是随时接受任何一个客户机发过来的通信信息,并将这个信息传递给目标通信程序。这也就是所谓的服务器转发机制。
话个图来说

客户端1———发送———>服务器
服务器搜寻目标客户端:客户端2.
服务器———发送———>客户端2

我所演示的是简单的数据通信。现实中还存在客户端2不在线的情况,离线推送的情况等等,在这里,各种情况都会牵扯到服务器的处理方法和数据的临时寄存等等,我就不赘叙了。

在程序内部的数据处理上,目标程序的做法和发送程序几乎是一样的,就是将发送程序的做法完全反过来来一遍。这一块我是着眼于byte来进行理解,就是将byte看作基本的数据传递单位。至于在物理层,是怎么以01 码的形式来传递的我们暂时就不去深究了,想要搞明白通信的全部基础知识的话那是一门绝对的课程来,对于我们来说,也没有不要现在立马搞明白路由的算法问题,以及包的收发机制。

好既然搞明白通信数据传输的问题,那我们就完成的通信的最基本的东西了。通信这东西必然是与简单到复杂的过程,比如在电磁波刚刚发明的时候那些NB的所谓先哲们估计也就是发了一个电磁波脉冲,然后另一端收到了这个脉冲,然后他们就叫嚷着说我发明了一个可以改变世界沟通方式的载体,然后他就被载入史册了。现在看来很简单,但是我估计第一次发明电磁波的人肯定还不知道要用调频、调幅、调相等方法来进行数据传递,所以信息的传递量是相当之少的。就像内容和清晰度是反函数一样,两者在其初期是会选择内容的。以最少的硬件成本创造最大的通信价值。但是,随着时间的后移,当硬件已经不是问题的时候,对数据传递的质量的要求就越来越高,所以出现了所谓的数字通信,这玩意而不是新东西,使用01电脉冲来传递信息让我想到了抗战片里面八路军那台嘀嘀嘀个不停的发报机,我没有深究那个时代的发报机是不是以01脉冲来进行数据传递,但是断断续续的滴滴声倒是相当的形象。

所以现在的网络通信内容与清晰度的函数因为硬件巨大升级而失效了,在信息传递容量不受限的前提之下,信息的质量被看得越来越重。但总得概括来说就是:基本传输的单元是byte,byte是8个01脉冲在电路中传输。至于其他的什么,对于我们菜鸟来说,太阳会升起来的,慢慢的都会知道的。

所以,在我的通信程序里面,客户端发送数据就截止到byte为止,服务器进行数据的收发的时候也是以byte为基本的单位来进行监听转发。

所以到这边,我已经可以进行在客户端与服务器之间进行byte的发送与接收。但是,问题又来了,中文发送的时候是乱码!!丫的,到这边,我不得不谈上次做的一个哈夫曼压缩的软件:对字符出现的频数,以此为哈夫曼建树的权值进行的。那个软件是按照ASCII编码给其对应的字符相应的哈夫曼编码来进行压缩的。程序写到一半我就非常担心了,因为中文是两个byte进行编码的,这样就来问题了:是不是我的压缩软件写到最后在压缩相应的中文编辑文件的时候会出错,没有办法压缩,或者解压出来是乱码?但是,当时又想不出比较好的方法来解决这样
的问题,索性先写完再说,看看实际运行的时候问题出现在什么地方,有什么方法可以解决。但是,运行的时候非常神奇,它既然很顺利地压缩了,也很顺利地解压了。看来中文的问题没有上升为敌我斗争的主要矛盾,我长舒一口气,估计在系统内部是不是有个什么机制自动将两个byte组装成了一个汉字编码然后显示出来了。这下我还沾沾自喜,觉得,哎呀,劳资挺聪明的哈,既然就猜到了这一步,这是典型的猪八戒吃人参果,反正囫囵吞了。
代码就不给大家看了,一句话讲明白就是我是原样还原的。详细点说:在原文件中,数据的存储是以01串的基本形式存在的,我依旧以其原先的01串的基本顺序在文件中,至于文件怎么去处理这个01串我就没有去考虑。

但是在处理通信问题的时候,我发现这样的处理方法不靠谱了,最直接的原因是我的客户端与服务器在数据发送与转发的最低的数量单位都是byte,这就是说,我是一个byte一个byte地来读的,但是这样以来,我按照原先的思路也就是一个byte一个byte地来读取的。所以在英文传递的时候还觉得没怎么样,但是一到中文就被枪毙了,因为中文是两个byte来进行翻译的。所以我还是按照原先的思路以数组方式来对数据进行封装,再以创建字符串的方式来显示。详细就不讲了,都可以百度到。

有很多人说,那肯定是要讲讲协议的。关于什么叫协议,我觉得有必要再打个比喻来说一下。我的理解就是:数据不等同于信息,数据是没有特殊含义的,但是信息却是有价值的,可以被理解的。我们先前完成的通信可以简单传递一个电脉冲,但是这并不等于电脉冲就是信息。有一天有人莫名其妙地给你发来短信,你打开一看,里面只有“1”。我估计你是会崩溃的,丫的纯粹在逗你玩~~对不?当代生活几乎就是建立在通信的基础上的,所以,这时候协议就显得很有必要了,它告诉数据的接受方这个数据的意思是什么。打个比方来说:大家都知道数据加密是怎么回事,其实通信这个时候和加密解密有点像,而协议就是告诉你,这段密文是什么意思,将普通的数据变成有用的信息。

那通信就是通过服务器借助协议的理解将信息从一端传递到另一端,我理解的通信就讲完了。

猜你喜欢

转载自ethankoo.iteye.com/blog/1614070