`
linsyyang
  • 浏览: 5171 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

从通信群聊谈s/c和i/o

阅读更多
花了很多天去学习了解通信这一块的东西,虽然还是有很多没明白也没有做出来的东西,但是,对于自己来说,重要的不
是没有的东西,而是把握好已经拥有的东西。所以,先把自己有的珍惜好了,再去找寻其他的想要的。
通信这里一直有两个难点困扰着我:
1.建立客户端和服务器之后对于客户端对象和服务器对象的理解;
2.建立连接之后对输入输出流的使用;

尽管对于有的人来说,就比如教我java的胡哥,理解一个东西似乎永远不如学会使用来的强,但就我自己的学习来说,
无法理解就无法运用,而运用的功能之一就是为了加强理解。所以,害怕以后的我还是对这一方面的东西忘记又产生困惑,
或者如果万一有像我这样困惑,而又一不小心点到我这一篇博客的人,对于我自己对这些东西的理解还是再说一说。还有
就是更正一下之前对于输入输出流的误解作出也不知道是不是对的更正吧。

先说一下我认为在这里最为重要的也让我困惑了许久的几行代码吧:
1.ServerSocket server=new ServerSocket(int port);
2.Socket socket=server.accept();
3.Socket socket=new Socket(String host,int port);
第一行和第二行代码是创建服务器时在服务器端使用的,因此一开始就让我产生了误解,误以为两行代码所产生的对象都
是服务器对象。但是,在第一行的代码中所新建的server对象确实是服务器对象,而第二行代码中的socket并不是
新建的对象,而是调用服务器的accept()方法获取的客户端对象,所以,此后,以这一行代码中的socket得到的输
入输出流都是客户端对象的输入输出流;
然后是第三行在连接客户端时所用的的代码。好吧,这里又曾经让我产生过误解。但是误解是什么已经不重要了,重要的
是我现在知道此处的socket所指代的对象是确确实实的“服务器”就行了。看到new字千万不要以为是新建了一个啥,
而是在实际意义上理解成为在地址为host,接口为port上产生的一个服务器,并不是新建,而是取出这个服务器对象,
以便调用。这里需要将三行代码连起来看,毕竟是通信嘛,1新建了一个服务器,接口为port,然后执行2,等待客户端
接入,只有客户端接入后才能运行2之后的代码,然后,在客户端那边,执行3,虽然意义上是新建了一个连接上服务器的
客户端,但该客户端对象确是在2执行时由服务器得到,客户端这边得到的事这个客户端对象连接到的服务器对象(似乎
还是有点晕晕的,亲爱的未来的我,静下心来仔细想想当时写下这段话是自己的逻辑吧)。

然后就是关于相互连接上的没有实际区分的客户端和服务器之间的输入输出流了。
不管是客户端还是服务器,获得输入输出流的方法都是一样的,读取byte时直接getInputStream()和
getOutputStream()。但是对于输入输出流的从属以及对于从输入输出流读取和写入数据的区分对于新接触到他们
的人来说还是有点难以理解的。主要还是对象的理清吧。从哪个对象得到的输入流,读取的就是哪个对象的数据;从哪个
对象得到的输出流,就是向哪个对象写入数据。而对于已经连接好了的服务器和客户端,服务器的输入流与客户端的输出
可以看做是相对应的同一条流,同理,服务器的输出流与客户端的输入流也是同一条流。
例如,
//此处的socket1是服务器对象
String s="服务器发送的消息";
OutputStream ous=socket1.getOutputStream();//获得服务器的输出流
byte[]b=(s).getBytes();//向服务器的输出流中写入数据
ous.write(b);
//此处的socket2是客户端的对象
InputStream ins=socket2.getInputStream();//获得的输入流是客户端的输入流
String s=readMsg(ins);//从客户端输入流中读取数据,而该数据来自与服务器同过服务器的输出流写入

好吧,以上就是我认为的在实现通信群聊中最难以解决的关于知识方面的东西。在这里,要很感谢很有耐心的康哥,已经
过谢了,但一想到自己之所以能不再纠结这些基础性的东西,一想到康哥那样耐心的一遍一遍的解释,还是感觉到很感谢
吧。

但是就算都了解了这些,程序也似乎还是完完全全重新写了三次(除了还有不计其数的小变动),由此而感受到的就不仅
尽是写代码的那啥了。写程序必需要先构建框架,算是这一次最大的教训吧。哪怕就是这么小的一个程序,如果不理清之
间的逻辑和流程,所要多花费的时间和精力就这么多,还好,亡羊补牢,为时未晚,养成先建大框架再考虑小细节的习惯,
就算会因为暂时的经验不足等原因还是需要花费很多劳力,但是磨刀不误砍柴工,这个习惯,不管是在敲代码还是以后真
正意义上的做事情之后都会有很大的用途。

一直在被说,通信这一块的大头是文件,是协议,这个,过两天再说吧。
前两天看了自己的第一篇博客,当时竟然不知天高地厚的说要每天写一篇,看看过来十天才更新的这一篇博客,真有一种
对不起当时激情昂扬的自己的感觉。怎么办,当然也知道那时的话怕是没机会实现了,还是给自己宽松一点的限制,争取
在学习的时候,一个月四五篇吧,有机会争取超额完成自己的任务。
还有我在实现通信群聊的基本类图,虽然是写完程序之后再理清的,也是第一次用那个什么uml画的,但是,哪怕百分中
只有五分能用到它,那也值得把它贴上一回了。
  • 大小: 25.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics