您的位置:首页 > 理论基础 > 计算机网络

黑马程序员-----tcp网络编程的总结和享元模式的总结

2012-01-01 10:11 323 查看
---------------------- android培训java培训、期待与您交流! ----------------------
一:java中TCP网络编程的总结

TCP网络编程涉及到客户端和服务器端,这与UDP中的发送端和接收端有很大区别。

TCP编程首先应该要明确TCP协议的特点:需要建立连接,形成传输通路。

下面就客户端和服务器端的不同分别总结TCP网络编程:

客户端:

1:建立端点,开启socket服务,并要指定进行连接的服务器地址和端口。这主要是通过将服务器ip地址和端口作为参数来创建Socket实例s完成的。

2:通过客户端套接字s的getInputStream()和getOutputStream()获取网络输入输出流,为了提供高效率,可通过BufferedReader和BufferedWriter将网络输入输出流封装成bufIo和bufOut。注意bufIo和bufOut的名字不是随便取的,如果需求还有从键盘读入数据,或者从客户端文件中读入数据时,必然也要创建BufferedReader的实例,那么上面的取名是非常必要的。

3:如果需求有进行键盘读入或者文件读入,那么就用bufIo.readLine()方法一行一行的读取数据,然后通过bufOut.wrte(buf)将读入的数据写入到数据缓冲区中。注意这里的bufOut.wrte(buf)写入的是数据缓冲区,并没有将数据发出去,需要用flush()方法将数据发送出去。同时还要注意此时发送过去的是有效数据,换句话说是没有换行符的,在服务器端如果需要一行一行的读取数据,那么此处必须进行newLine()操作。综合起来就是:

BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

         String line = null;

         while((line=bufIn.readLine())!=null)

         {

                   bufOut.write(line.toUpperCase());

                   bufOut.newLine();//回车,结束标记

                   bufOut.flush();

         }

4:如果进行了文件读取,就要关闭文件时用到的读取流,如果没有就关闭套接字s,s的关闭会自动的将bufIn 、bufOut进行关闭,因为bufIn 、bufOut全都依赖于套接字s。一旦s不存在,这两个流也就不存在了。

 

服务器端TCP网络编程的步骤:

1:和客户端一样,开启服务,不过此时用到的是ServerSocket来创建实例ss,创建ss的时候还应该指定一个该套接字要进行监听的端口。这个端口应该和客户端套接字中连接服务器是的端口一致,以确保数据能够被服务器收到。

2:通过ss的方法

 Socket
accept()

          侦听并接受到此套接字的连接。
来获取客户端套接字s的实例对象

         Soceket  s =  ss.accept();

3: 通过客户端套接字s的getInputStream()和getOutputStream()获取网络输入输出流,为了提供高效率,可通过BufferedReader和BufferedWriter将网络输入输出流封装成bufIo和bufOut。然后通过bufIo.readLine()进行一行一行的读取,如果需求中有需要通过服务器的处理后还要将这些数据再发送回客户端,那么就通过bufOut.write();方法将数据发回客户端,注意此处发过去的也是有效数据,在某些情况下也要进行newLine()。同时此处还只是将数据发送到数据缓冲区,需要调用flush()方法进行刷新。综合如下:

BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

         String line = null;

         while((line=bufIn.readLine())!=null)

         {

                   bufOut.write(line.toUpperCase());

                   bufOut.newLine();//回车,结束标记

                   bufOut.flush();

         }

4:关闭资源

 

二:享元模式的总结(参考黑马论坛上帖子)

享元模式 flyweight:设计模式    如果很多很小的对象他们有很多相同的东西,那就可以把他们变成一个对象,不同的东西作为方法的参数传入,称为外蕴状态,那些相同的熟悉称为内蕴状态。

首先通过张老师讲的例子引入享元模式:

Integer t1 = 3;

Integer t2 = 3;

System.out.println(t1==t2); 运行结果为true

Integer t1 = 137;

Integer t2 = 137;

System.out.println(t1==t2); 运行结果为false

出现上述不同运行结果的原因是,对于基本数据类型的数据,要装箱成Integer对象的时候,如果多个数据都在一个字节范围之内(-128~127),则这些数据共享同一个Integer对象,若超出这个范围,则这些数据装箱之后对应不同的Integer对象。

享元模式概念:

享元模式是对象的结构模式,它以共享的方式高效地支持大量的细粒度对象。通俗讲就是,有很多小的对象,它们有很多相同的属性,则在装箱之后共享同一个对象,这些相同的属性称为这个对象的内蕴状态,那些不同的属性,则把它们变成方法的参数,称之为这个对象的外蕴状态。

享元对象能做到共享的关键是区分内蕴状态和外蕴状态。

一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而改变的,因此一个享元可以具有内蕴状态并可以共享。

一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由由端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。

外蕴状态不可以影响享元对象的内蕴状态。换句话说,它们是相互独立的。

享元模式在编辑器系统中大量使用。一个文编辑器往往会提供很多种字体,而通常的做法就是将每一个字母做成一个享元对象。享元对象的内蕴状态就是这个字母,而字母在文本中的位置和字体风格等其他信息则是外蕴状态。比如,字母a可以出现在文本的很多地方,虽然这些字母a的位置和字体风格不同,但是所有这些地方使用的都是同一个字母对象。这样一来,字母对象就可以在整个系统中共享。

享元模式的]优点在于它大幅度地降低内存中对象的数量,但是享元模式使得系统更加复杂,为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

享元模式将享元享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

 

 

------
97aa
---------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息