锁定老帖子 主题:网络通信总结(1)
精华帖 (1) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (13)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-16
网络通信,实际上就是在不同机器上的两个程序间的字节(或二进制位)传输。 一般情况下,两个通信的程序中,一个是请求者,我们称之为客户端,另一个是等待被请求者,这就是服务器。
简单服务器创建格式比较简单,格式如下: java.net.ServerSocket server = new java.net.ServerSocket(9090); 其中的参数9090,指的是创建服务器时所使用的端口号。 每台电脑上都有65536个端口号,服务器在指定的端口上等待客户机的连接进入。 创建好服务器对象后,接下来就是等待客户机连入: java.net.Socket client = server.accept();//等待客户机连接进入 //这个方法会阻塞,它会一直等待直到有客户机连接进入,才会执行后面的代码
客户机连接进入后,就可以获取到客户机的输入输出流对象
java.io.InputStream ins = client.getInputStream(); java.io.OutputStream ous = client.getOutputStream();
通过输出流对象(ous),可以将字节流发送给客户机; 通过输入流对象(ins),可以接收到从客户机发送过来的字节流; 使用输入流的read()方法时,也会阻塞,它会一直等待,直到有字节传过来。
创建服务器是比较简单的,而定义双方的通信规则才是关键。 传送的字节流在何处表示一条消息,这是我们要思考的。现在学习的结束标志是"\r\n",我们可以根据自己的想法,自己定义规则。 如XMPP协议格式,使用XML式的结构来定义通信协议。可以自己定义在标签<msg>和标签</msg>之间的内容即为一次通信发送的一条完整消息。
我们要思考的还有代码重构,以及模块化设计。 选择增加一个新类,还是在原来的类里面增加功能; 是否将某些代码封装成一个独立的方法,何时封装; 这些都没有一个统一的标准,只有通过不断地练习,不断地思考、总结,才能逐渐写出高质量的代码。 我认为,每一个类都应该只负责单一方面的功能,如ChatTools类,表示的是通信工具类,它只负责消息的转发,保存处理客户的线程队列。 同时还要考虑,一个类是否要实例化,如果我们只是使用类中的方法,而不需要实例化该类,那么我们就将方法定义为静态的。 为了不给这个类有实例化的机会,我们还要将这个类的构造函数私有化。 类中的代码尽量封装成独立的方法,这样不仅可以方便重复调用,减少代码冗余,而且思路也会更清晰。
在练习中还有一个问题需要谨慎对待。 方法中的可能出现的异常是在方法中处理掉(即在方法中使用try{}catch(Excrption e){}处理), 还是直接将异常抛给上层调用者(即throws Exception),由上层调用者去处理。 如果在方法中处理掉时,应该避免上层调用者出现死循环。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-07-18
这个科普贴也太水点了吧
|
|
返回顶楼 | |
发表时间:2011-07-18
楼主又要去做题了
|
|
返回顶楼 | |
发表时间:2011-07-18
freish 写道 楼主又要去做题了
神马意思啊 |
|
返回顶楼 | |
发表时间:2011-07-18
标题很大。
|
|
返回顶楼 | |
发表时间:2011-07-18
前半部分和后半部分完全对不上啊
|
|
返回顶楼 | |
发表时间:2011-07-19
悲剧了 写道 这个科普贴也太水点了吧
|
|
返回顶楼 | |
发表时间:2011-07-19
感觉很一般,上文不接下文,蜻蜓点水,但又没有点到水,结果就是水上飞
|
|
返回顶楼 | |
发表时间:2011-07-19
情何以堪。。。 上文一看就明白,下文咋看都不明白。。。牛头不对马嘴。。
|
|
返回顶楼 | |
发表时间:2011-07-19
yjc2020 写道 freish 写道 楼主又要去做题了
神马意思啊 面试 的意思吧 ![]() |
|
返回顶楼 | |