论坛首页 Java企业应用论坛

网络通信总结(1)

浏览 5383 次
精华帖 (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),由上层调用者去处理。

如果在方法中处理掉时,应该避免上层调用者出现死循环。

 

   发表时间:2011-07-18  
这个科普贴也太水点了吧
0 请登录后投票
   发表时间:2011-07-18  
楼主又要去做题了
0 请登录后投票
   发表时间:2011-07-18  
freish 写道
楼主又要去做题了


神马意思啊
0 请登录后投票
   发表时间:2011-07-18  
标题很大。
0 请登录后投票
   发表时间:2011-07-18  
前半部分和后半部分完全对不上啊
0 请登录后投票
   发表时间:2011-07-19  
悲剧了 写道
这个科普贴也太水点了吧

0 请登录后投票
   发表时间:2011-07-19  
感觉很一般,上文不接下文,蜻蜓点水,但又没有点到水,结果就是水上飞
0 请登录后投票
   发表时间:2011-07-19  
情何以堪。。。 上文一看就明白,下文咋看都不明白。。。牛头不对马嘴。。
0 请登录后投票
   发表时间:2011-07-19  
yjc2020 写道
freish 写道
楼主又要去做题了


神马意思啊


面试 的意思吧 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics