十三天学会java第十三天网络编程与设计模式.docx

上传人:b****5 文档编号:11773497 上传时间:2023-04-01 格式:DOCX 页数:47 大小:224.16KB
下载 相关 举报
十三天学会java第十三天网络编程与设计模式.docx_第1页
第1页 / 共47页
十三天学会java第十三天网络编程与设计模式.docx_第2页
第2页 / 共47页
十三天学会java第十三天网络编程与设计模式.docx_第3页
第3页 / 共47页
十三天学会java第十三天网络编程与设计模式.docx_第4页
第4页 / 共47页
十三天学会java第十三天网络编程与设计模式.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

十三天学会java第十三天网络编程与设计模式.docx

《十三天学会java第十三天网络编程与设计模式.docx》由会员分享,可在线阅读,更多相关《十三天学会java第十三天网络编程与设计模式.docx(47页珍藏版)》请在冰豆网上搜索。

十三天学会java第十三天网络编程与设计模式.docx

十三天学会java第十三天网络编程与设计模式

十三天学会java第十三天-网络编程与设计模式

分类:

 十三天java2013-05-1823:

33 53人阅读 评论(0) 收藏 举报

行业数据服务器Java

目录(?

)[+]

声明:

此java系列笔记编辑整理于魔乐网,原网页有视频同步(如果还有的话).

3.1、网络编程(了解)

         网络编程指的就是通过网络进行程序数据操作,既然是网络开发,那么一定就分为用户和服务两端,而这两个端的开发实际上就有以下的两种不同的架构(面试题:

请解释C/S和B/S的区别?

):

· C/S(Client/Server):

要开发两套程序,一套是服务器端,另外一套是与之对应的客户端,但是这种程序在日后进行维护的时候,是需要维护两套程序,而且客户端的程序更新也必须及时,此类程序安全;

· B/S(Browser/Server):

要开发一套程序,只开发服务器端的,客户端使用浏览器进行访问,这种程序在日后进行程序维护的时候只需要维护服务器端即可,客户端不需要做任何的修改,此类程序使用公共端口,包括公共协议,所以安全性很差。

         如果从网络的开发而言,大的分类是以上的两类,可是从现在的开发来讲,更多的情况是针对于B/S程序进行的开发,或者可以这么理解:

B/S程序的开发属于网络时代,而C/S程序的开发属于单机时代。

而对于WebService的开发,实话而言,也属于B/S结构的程序(跨平台)。

         而在日后学习Android开发的时候,如果要考虑安全性使用Socket,如果要考虑方便性,还是基于WEB的开发方便使用。

而对于网络的开发在Java中也分为两种:

TCP(传输控制协议,可靠的传输)、UDP(数据报协议),对于网络开发,本次只专注于TCP程序的实现。

3.2、网络程序的基本实现(了解)

         如果要进行网络程序的开发,那么首先应该开发出的就是服务器端,本次的操作使用服务器端向客户端输出一个“HelloWorld.”的字符串信息,而如果要想完成服务器端的开发,则需要包中的两个类:

                  · ServerSocket类:

是一个封装支持TCP协议的操作类,主要工作在服务器端,用于接收客户端请求;

                   · Socket类:

也是一个封装了TCP协议的操作类,每一个Socket对象都表示一个客户端。

         而现在必须观察这两个类之中的操作方法:

                   · ServerSocket类的方法:

No.

方法名称

类型

描述

1

publicServerSocket(intport)throwsIOException

构造

开辟一个指定的端口监听,一般使用5000以上

2

publicSocketaccept()throwsIOException

普通

服务器端接收客户端请求,通过Socket返回

3

publicvoidclose()throwsIOException

普通

关闭服务器端

                   · Socket类的方法:

No.

方法名称

类型

描述

1

publicSocket(Stringhost,intport)throwsUnknownHostException,IOException

构造

指定要连接的主机(IP地址)和端口

2

publicOutputStreamgetOutputStream()throwsIOException

普通

取得指定客户端的输出对象,使用的时候肯定使用PrintStream装饰操作

3

publicInputStreamgetInputStream()throwsIOException

普通

从指定的客户端读取数据,使用Scanner操作

范例:

完成一个服务器端程序代码

package demo;

import java.io.PrintStream;

import .ServerSocket;

import .Socket;

public class HelloServer{

    public static void main(String[]args) throws Exception{

        ServerSocketserver= new ServerSocket(9999); // 在9999端口监听

        System.out.println("服务开始启动...");

        Socketclient=server.accept(); // 接收客户端连接,进入到阻塞状态

        PrintStreamout= new PrintStream(client.getOutputStream());

        out.println("HelloWorld."); // 向客户端输出

        out.close(); // 输出流的关闭

        client.close(); // 关闭客户端

        server.close(); // 关闭服务器端

        System.out.println("服务器已关闭...");

    }

}

         现在服务器端已经开发完成了,而现在的服务器端虽然是通过Java编写的,但是使用的是TCP协议,所以可以利用系统命令的telnet进行访问。

                   · 使用运行方式输入:

telnet;

                   · 连接服务器:

openip地址 端口,openlocalhost9999;

         但是现在是利用了系统的工具完成的,那么在开发之中是不可能使用这工具,应该自己去编写客户端。

范例:

编写一个客户端

package demo;

import .Socket;

import java.util.Scanner;

public class HelloClient{

    public static void main(String[]args) throws Exception{

        Socketclient= new Socket("localhost",9999);

        Scannerscan= new Scanner(client.getInputStream());

        scan.useDelimiter("\n");

        if (scan.hasNext()){ // 有数据

            System.out.println("服务器的回应数据:

" +scan.next());

        }

        scan.close();

        client.close();

    }

}

         整个的操作就是一个输出和输入的过程,只是现在的输出和输入的来源在于网络,而不是像之前那样是通过文件操作了。

3.3、网络开发的经典模型 —— ECHO程序

         这种开发模型的典型模式指的是客户端要输入信息,而后服务器端接收这端信息之后,前面增加一个“ECHO:

”的信息再返回给客户端,也就是说现在的服务器端需要输入和输出数据。

范例:

编写一个程序的基本模型

package demo;

import java.io.PrintStream;

import .ServerSocket;

import .Socket;

import java.util.Scanner;

public class EchoServer{

    public static void main(String[]args) throws Exception{

        ServerSocketserver= new ServerSocket(9999);

        boolean flag= true;

        System.out.println("服务器运行...");

        Socketclient=server.accept(); // 接收客户端请求

        Scanner scan = new Scanner(client.getInputStream());

        PrintStreamout= new PrintStream(client.getOutputStream());

        while (flag){

            if (scan.hasNext()){ // 有内容

                Stringstr=scan.next();

                if ("byebye".equalsIgnoreCase(str.trim())){ // 程序结束

                    out.println("ByeBye...");

                    flag= false; // 退出循环

                }

                out.println("ECHO:

" +str.trim()); // 回应数据

            }

        }

        System.out.println("服务器停止运行...");

        server.close();

    }

}

         这个时候程序实际上是一种单线程的运行状态,这样的程序运行起来只能够为一个用户进行服务,所以如果希望一个服务器可以同时处理多个客户的操作,那么就必须为其实现多线程的处理机制,让每一个客户端表示一个独立的线程对象,每个线程对象有自己独立的输入输出操作。

范例:

为服务器端增加多线程机制,使用匿名内部类

package demo;

import java.io.IOException;

import java.io.PrintStream;

import .ServerSocket;

import .Socket;

import java.util.Scanner;

public class EchoServer{

    public static void main(String[]args) throws Exception{

        ServerSocketserver= new ServerSocket(9999);

        boolean flag= true;

        System.out.println("服务器运行...");

        while (flag){

            final Socketclient=server.accept(); // 接收客户端请求

            new Thread(new Runnable(){

                @Override

                public void run(){

                    boolean runFlag= true;

                    try {

                        Scanner scan = new Scanner(client.getInputStream());

                        PrintStreamout= new PrintStream(client.getOutputStream());

                        while (runFlag){

                            if (scan.hasNext()){ // 有内容

                                Stringstr=scan.next();

                                if ("byebye".equalsIgnoreCase(str.trim())){ // 程序结束

                                    out.println("ByeBye...");

                                    runFlag= false; // 退出循环

                                }

                                out.println("ECHO:

" +str.trim()); // 回应数据

                            }

                        }

                    } catch (IOExceptione){

                        e.printStackTrace();

                    }

                    try {

                        client.close();

                    } catch (IOExceptione){

                        e.printStackTrace();

                    }

                }

            }).start();

        }

        System.out.println("服务器停止运行...");

        server.close();

    }

}

         但是,在这个时候对于线程的控制也需要处理好,如果处理不好,可能就出现死锁问题了。

4、总结

         知道什么叫网络编程就行了,暂时用不到。

3、具体内容

         之前的所有内容都在本处进行总结,而且对于之前的一些概念不清楚的东西(代码会写)那么都可以不用去看了,把本次程序弄会了,一切就都会了,后面也就都会了。

3.1、程序分层(理解)

         在一个完整的项目之中,对程序进行合理的分层,可以让开发变得更加的方便,也更加的具备层次感,每一层有每一层的开发人员,例如:

可以简单的理解为美工 + 程序相分离。

而实际上的分层操作,可以这样参考:

         如果按照含金量来讲,首先把握住业务层是整个程序的实现关键,但是对于前台显示更加的重要。

今天的主要任务是观察业务层和数据层的开发,而到了JavaWEB之后,才开始实现显示层和控制层的开发。

         在项目之中后台的建立直接有着重要的地位,但是不同层之间最为重要的连接组成部分就是接口,所以整个代码开发之中,对于后台代码就一定要有两个组成接口(业务层接口,给以后的控制层使用、数据层接口,给以后的业务层使用)。

         · 数据层(数据访问层,DataAccessObject):

指的是执行数据的具体操作,而现在的开发之中,大多数都是针对于数据库的开发,所以在数据层之中的主要任务是负责完成数据的CRUD,而在java之中,如果要想进行数据的CRUD实现,肯定使用java.sql.PreparedStatement接口;

         · 业务层(业务对象,BusinessObject,BO,又或者将其称为Service,服务层),服务层的主要目的是根据业务需求进行数据层的操作,一个业务层要包含多个数据层的操作。

         清楚了基本概念之后,那么新的问题就该出现了,如何去区分业务层或者是数据层?

下面以玉史先生吃饭为例,说明一下。

         如果说现在某一个项目业务非常复杂,可能分为若干个子业务,那么就还需要一个总的业务层操作。

3.2、实例分析(重点)

         下面以emp数据表(empno、ename、job、hiredate、sal、comm,都是基本字段)为例分析一个操作,客户要求可以实现如下的几个功能:

                   · 【业务层】增加一个新雇员信息;

                            |- 〖数据层〗要根据增加的雇员编号查看此雇员是否存在;

                            |- 〖数据层〗如果雇员不存在则执行插入操作,如果存在则不插入;

                   · 【业务层】修改一个雇员的信息;

                            |- 〖数据层〗直接传入新的数据即可,如果没有修改返回的更新行数是0;

                   · 【业务层】删除一个雇员的信息;

                            |- 〖数据层〗直接传入要删除的雇员编号即可,如果没有此雇员信息返回的是0;

                   · 【业务层】根据编号查询一个雇员的信息;

                            |- 〖数据层〗返回一个雇员的完整信息;

· 【业务层】取得全部雇员的信息,要求可以实现模糊查询和分页显示,查询结果除了返回数据之外,还要求知道模糊或全部查询时所返回的全部数据量:

                            |- 〖数据层〗模糊或查询全部满足条件的雇员数据,多个数据;

                            |- 〖数据层〗使用COUNT()进行满足条件的数据统计。

 

3.3、准备阶段(重点)

3.3.1 、VO类:

负责数据的传输与包装

         但是现在有一个最为严重的问题出现了,不同层之间(这些层除了数据层要操作SQL之外,那么其他层操作的数据都应该是对象),所以应该有一个负责传输的数据对象,这个对象可以称为ValueObject(VO,POJO、TO、PO)。

         但是,现在对于简单Java类的开发原则也发生了一些变化:

                   · 类名称要和表名称保持一致;

                   · 为了日后类的操作方便,所有的简单Java类必须实现java.io.Serializable接口;

                   · 类中不允许出现任何的基本数据类型,只能使用包装类;

                   · 类之中的所有属性都必须封装,必须都编写setter、getter;

                   · 类之中一定要提供有无参构造方法。

         在DAO的开发之中,所有的名称都有严格规定,假设现在的项目的总包名称为:

cn.mldn.oracle,那么现在这个VO类的保存包名称就应该是cn.mldn.oracle.vo。

范例:

定义cn.mldn.oracle.vo.Emp类

package cn.mldn.oracle.vo;

import java.io.Serializable;

import java.util.Date;

@SuppressWarnings("serial")

public class Emp implements Serializable{

    private Integer empno ;

    private String ename ;

    private String job ;

    private Date hiredate ;

    private Double sal ;

    private Double comm ;

    //setter、getter略,自己补充

}

3.3.2 、DatabaseConnection类:

负责数据库连接

         既然现在要完成数据层的开发,那么就一定需要数据库的连接与关闭操作,可是如果将数据库的连接和关闭都写在每一个数据层之中,这样代码过于重复,而且也不方便维护,那么为了方便起见,现在定义一个DatabaseConnection的类,这个类专门负责取得和关闭数据库连接。

而这个类定义在cn.mldn.oracle.dbc包之中。

范例:

定义cn.mldn.oracle.dbc.DatabaseConnection

package cn.mldn.oracle.dbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

/**

 * 本类的主要功能是负责数据库的连接与关闭的

 * @author MLDN

 */

public class DatabaseConnection{

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;

    private static final String DBURL = "jdbc:

oracle:

thin:

@localhost:

1521:

MLDN" ;

    private static final String DBUSER = "scott" ;

    private static final String PASSWORD = "tiger" ;

    private Connection conn = null ;    // 保存连接对象

    /**

     * 构造方法的主要目的是进行数据库连接,只要在程序之中实例化了DatabaseConnection对象

     * 那么就表示要进行数据库的连接操作了,所以在构造方法之中连接数据库

     * 在本构造方法之中,如果出现了异常,将直接输出异常信息,因为如果数据库连接都没有了,根本就无法操作

     */

    public DatabaseConnection(){

        try {

            Class.forName(DBDRIVER);

            this.conn =DriverManager.getConnection(DBURL, DBUSER, P

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1