`
郑_freewind
  • 浏览: 5063 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

学习总结

阅读更多
作为一篇总结,我并没有打算说去整篇的复制粘贴代码了,更确切的说是我根本就不打算去写代码,我只打算去说一下,我对这个代码的分析和感悟,这个我认为是更重要的。
OK,废话就不多说了。
首先,我介绍一下,这一阶段的大致总结是通信。

然后,我来分析一下对通信这段代码的感悟吧。学习之前,我是报着一个很盲目的心态去学的,我觉得通信应该是一个很难的事情了。。 但是,当我真正学习了之后,发现,他也的确是很难,但是,通信难得并不是通信这个概念,或者是难在怎么构建和别的机器进行连接,真正的难是我们在协议的制定和协调上面需要考虑很多。。
现在我拿一个五子棋来举例:

如果是一个单机版的五子棋,OK,那很简单,就是画棋子,判断胜负这两步,当然这要抛开其他那些悔棋,认输之类的步骤,这样的话,我们首先就能做好一个简单的五子棋的游戏。这是单机版的,那网络版的五子棋和单机版的五子棋差在哪里呢。这就像我们在一些游戏大厅,或者自己的电脑上玩单机版的五子棋的时候,我们总能发现,我们能够找到这一局的棋谱,其实,如果知道这个棋谱是怎么保存并读取的,我们大致上就能够完成一个网络版的五子棋了。
为什么呢?因为网络版五子棋和单机版的五子棋唯一的差别就在于这个棋谱是不是也存到了别人的电脑上。如果我们想将这些信息存入到别人的电脑上,很简单,我们使用一个输入输出流就解决了,但是,就像我们把office文件用记事本打开一样,我们得到的只能是乱码,如果我们随便的将信息存入到别人的电脑上,就像你对着一个美国人说中文一样,他根本就不知道你在说什么,唯一能够知道的是,他说话了,但我不知道他在说什么,最终结果是说了和没说其实没有任何的差别,所以,我们需要的做到的就是规定一个我们两者共同使用的规则,也就是协议。



下面我简单的分析一下五子棋的协议:

首先,因为电脑并没有自己的思维方式,他并不会纠错,所以,只要之间的协议通信错了一步,那后面就错个干净。这是我们要明确的。
然后,电脑可以一个字节一个字节的读取,也可以一个Int一个int的读取,但是他不能读取文字,就算可以,也是将他转化为字节来表示的,所以我们需要用所有的字节或者是整形来代替我们想要表达的内容,并且是要明确的规定什么时候读byte,什么时候读int,这个是重点。


就像五子棋一样,如果我们规定1是下棋命令,2是按钮的命令,也就是说,我们规定协议的时候需要在一开始就规定,第一个发送(读取)的消息是Int,如果是1,则按照下棋的方法读下去,也就是再去读两个Int型的坐标值,仅仅知道这些还并不够,我们仍旧需要知道棋子的颜色,所以,我们还要读取一个代表颜色的值,因为五子棋只有两个颜色,那我们就知道用1代表黑色,-1代表白色,这样的话,如果是下棋,我们就会发送一条信息,像这样,1xy1,x,y代表的是坐标,这串数字的意思就是,我们要下棋,是在(x,y)这个位置下黑棋。

然后是2的按钮命令,那么,我们就给每个按钮设置一个数字代表,假设悔棋是1,认输是2,那我们如果发送一条信息是21,那么就代表的是我按了一下按钮了,而且,我想要说的话是我想悔棋,切记一定不能多读,也不能少读,如果多读少读了,后果会很严重,不信的同学可以自己去试一下。

接下去,如果我们想要拓宽,也就是如果我们想在下棋的时候也能够聊天,同上述方法一样,我们可以在一开的发送值为3,这代表着,我这条信息是要发送信息了。然后,我们必须要加上,我们发送的消息的长度,为什么?因为我们没有这个长度,如果有人想要攻击你的电脑,很轻松的就可以通过不断的发送消息,然后,让你的电脑,爆掉,仅仅是消息,能让你的服务器崩溃了,所以第二个数字,一定要是这条信息的长度,然后就是我们要发送的信息的长度,如果长度不够的话,就补上空格,如果多了的话,那就继续发条消息,作为一个以3开头的消息命令发送过去。
但是我本人可能会更推荐你重新开启一个客户端,因为这样可以不占用上一个端口读取,发送的处理时间。
设想一下,我们在处理读取信息的时候,必须要用到一个线程,为什么呢,因为你无法保证对面是等你处理完消息之后才发消息过来,如果不实用线程的话,我们就无法保证我们能够快速的处理到每一个消息。这样,我们知道,线程增多会给CPU带来负担,当你不断的发送信息的时候,线程就会很慢,这样就影响到了下棋的速度,这显然不是我们想要的,我们能够聊天,也能下棋这才是我们想要的。

说一下我出现的问题,当我们发送消息的时候一定不要一个一个的发送,因为你一个一个发送,线程就会一个一个去处理,这会怎么样,这个后果很严重啊,也就是说,你发送了一个消息,线程就去处理了,那你本应该跟在表示下棋1这个消息后面的消息也就被另一个线程处理了,那么,你就会发现,在你规定了正确的协议之后,你的消息仍旧无法正确的发送过去,因为你的消息已经被你在不知不觉中改变了,所以消息的连贯性,这个也是很重要的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics