体系结构报告

实验名称

 应用系统C/S风格客户端程序处理流程设计

专  业

软件工程

姓    名   

 

学  号

 

班  级

  

 

  • 实验目的:

 

理解客户应用程序的开发应集中于数据显示和分析,服务器的开发应集中于数据管理。

 

  • 实验内容:

 

对于应用系统的C/S风格客户端程序处理流程进行设计,采用图形化的方法描述最主要、关键、核心的处理流程。

 

  • 实验设备及软件环境:

 

硬件:实验室电脑

软件:visio

 

  • 实验过程及结果:

 

对于应用系统的C/S风格客户端程序处理流程进行设计,采用图形化的方法描述最主要、关键、核心的处理流程。

A.系统体系主体的处理流程

 

 

 

  1. 用例图

        用户使用聊天室的用例图

        

  1. DFD(数据流图)

 

 

 

 

 

 

 

 

 

 

D.系统流程图     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E.构成TCP/IP协议的通讯模式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 总结

   这一次实验我通过作图,将项目更加形象化的表示了出来,图形的说明更可以清晰明了使大家看懂,作为重要的工具,应该被我们提倡并大范围使用,通过查找资料UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂系统进行建模方面,特别是在软件架构层次,已经被验证有效。统一建模语言是一种模型化语言。模型大多以图表的方式表现出来。一份典型的建模图表通常包含几个块或框,连接线和作为模型附加信息之用的文本。这些虽简单却非常重要,在UML规则中相互联系和扩展。以后的实践过程中我也会多利用这一类辅助工具,完善文档,而且我也会继续努力,完成聊天室的项目。

    

 

 

 

 

 

实验成绩:          指导教师:              

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验名称

 应用系统C/S风格客户端

程序结构设计

专  业

软件工程

姓    名   

 

学  号

 

班  级

  

 

  • 实验目的:

 

理解客户应用程序应提供用户与服务器交互的界面;向服务器提交用户请求并接收来自服务器的信息;利用客户应用程序对存在于客户端的数据执行应用逻辑要求。

 

  • 实验内容:

 

用层次图描述客户端软件结构,以说明客户端程序由哪些模块组成,模块与模块之间的调用、被调用和顺序关系等关系。

 

  • 实验设备及软件环境:

 

硬件:实验室电脑

软件:Eclipse   word

 

  • 实验过程及结果:

 

用层次图描述客户端软件结构,以说明客户端程序由哪些模块组成,模块与模块之间的调用、被调用和顺序关系等关系。

       

 

     

 

 

 

 

 

 

 

 

 

 

模块化功能之间:                      

代码:

//server.java

package Socket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

public class server implements Runnable {// 服务端

    static List<Socket> socketList=new ArrayList<Socket>();

// 读取 In

    static Socket socket = null;

    static ServerSocket serverSocket = null;

    public server() {// 构造方法

        try {

            serverSocket = new ServerSocket(9999);

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.println("************服务端*************");

        server t = new server();

        int count = 0;

        while (true) {          

            try {

//              System.out.println("端口9999等待被连接......");

                socket = serverSocket.accept();

                count++;

                System.out.println("第" + count + "个客户已连接");

                socketList.add(socket);

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            Print p = new Print(socket);

            Thread read = new Thread(t);

            Thread print = new Thread(p);

            read.start();

            print.start();

        }

    }

    @Override

    public void run() {

        // 重写run方法

        try {

            Thread.sleep(1000);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket

                    .getInputStream()));

            while (true) {

                String jieshou = in.readLine();

                System.out.println( jieshou);

                for (int i = 0; i < socketList.size(); i++) {

                    Socket socket=socketList.get(i);

                    PrintWriter out = new PrintWriter(socket.getOutputStream());

                    if (socket!=this.socket) {

                        out.println(jieshou);

                    }else{

                        out.println("(你)"+jieshou);

                    }

                    out.flush();

                }

            }

        } catch (Exception e) {

 

            e.printStackTrace();

        }

    }

}

class Print implements Runnable {

    static List<Socket> socketList=new ArrayList<Socket>();

    Scanner input = new Scanner(System.in);

    public Print(Socket s) {// 构造方法

        try {

            socketList.add(s);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    @Override

    public void run() {

        try {

            Thread.sleep(1000);

            while (true) {

                String msg = input.next();

            for (int i = 0; i < socketList.size(); i++) {

                Socket socket=socketList.get(i);

                PrintWriter out = new PrintWriter(socket.getOutputStream());

                // System.out.println("对客户端说:");

                out.println("服务端说:"+msg);

                out.flush();

            }

            }

        } catch (Exception e) {

            // TODO: handle exception

            e.printStackTrace();

        }

    }

}

//client.java

package Socket;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;

public class client implements Runnable {// 客户端

    static Socket socket = null;

    Scanner input = new Scanner(System.in);

    static String name=null;

    public static void main(String[] args) {

        int x=(int)(Math.random()*100);

        client.name="client"+x;

        System.out.println("************客户端"+x+"*************");

        try {

            socket = new Socket("127.0.0.1", 9999);

            System.out.println("已经连上服务器了");

        } catch (Exception e) {

            e.printStackTrace();

        }

        client t = new client();

        Read r = new Read(socket);

        Thread print = new Thread(t);

        Thread read = new Thread(r);

        print.start();

        read.start();

    }

    @Override

    public void run() {

        try {

            Thread.sleep(1000);         

            PrintWriter out = new PrintWriter(socket.getOutputStream());

            while (true) {

                String msg = input.next();

                out.println(name+"说:"+msg);

                out.flush();

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

class Read implements Runnable {

    static Socket socket = null;

    public Read(Socket socket) {

        this.socket = socket;

    }

    @Override

    public void run() {

        try {

            Thread.sleep(1000);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket

                    .getInputStream()));

            while (true) {

                System.out.println(  in.readLine());

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

五、总结

在选择合适体系结构的基础上,通过实验中的不懈努力,我最终基本满足了聊天程序的需要,在这过程中,修改多线程的部分,成为我实践中的一个困难,多线程的实现有助于多个客户端之间的交流,但是在接口的处理和代码的实现还具有一些问题,需要细心的去串联上下文的代码,这次的实验,也让我反省到,之前的某些知识像一盘散沙,基础知识可能有涉猎,但是在实际应用的过程中却不断碰壁,我们需要自己寻找更多的实践机会,来增强解决实际问题的能力。尤其在面向对象的语言java编程技术还需要深入的认识,对其工作方式和原理还需要透彻的学习。而且这个专题选用的是C/S体系结构,其实课本中或者是实践中还有更多种类的体系结构,需要我们去仔细的学习,掌握并且能够清晰的辨析出每种体系结构的特点,合理的应用在实践项目中,是编好程序的第一步!

 

 

 

 

 

 

实验成绩:            指导教师:              

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验名称

 应用系统C/S风格软件体系结构

的需求分析

专  业

软件工程

姓    名   

 

学  号

 

班  级

  

 

  • 实验目的:

 

理解C/S体系结构服务器、应用程序和网络三个主要组成部分。

 

  • 实验内容:

 

对应用系统,进行软件体系结构的需求分析,说明选用C/S风格的原因,对服务器和客户应用程序进行任务分配。

 

  • 实验设备及软件环境:

 

硬件:实验室电脑

软件:Eclipse javaEE

 

  • 实验过程及结果:

 

本人此次的项目是多进程的java聊天系统,采用的是C/S体系结构

具体的实验内容如下:

  1. 对应用系统,进行软件体系结构的需求分析,说明选用C/S风格的原因,对服务器和客户应用程序进行任务分配。

我选用C/S风格的原因如下:

客户机/服务器(Client/Server,C/S)是20世纪90年代开始成熟的一项技术,是大家熟知的客户机和服务器结构。主要针对资源不对等问题而提出的一种共享策略。

客户机/服务器是两个相互独立的逻辑系统,为了完成特定任务,它们形成了一种协作关系,它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

在Client/Server结构的系统中,应用程序分为客户端和服务器端两大部分。客户端部分为每个用户所专有,而服务器端部分则由多个用户共享其信息与功能。客户端部分通常负责执行前台功能,如管理用户接口、数据处理和报告请求等;而服务器端部分执行后台服务,如管理共享外设、控制对共享数据库的操作等。这种体系结构由多台计算机构成,它们有机地结合在一起,协同完成整个系统的应用,从而达到系统中软、硬件资源最大限度的利用。

任何一个应用系统,不管是简单的单机系统还是复杂的网络系统,都由3个部分组成:显示逻辑部分(表示层)、事务处理逻辑部分(功能层)和数据处理逻辑部分(数据层)。显示逻辑部分的功能是与用户进行交互;事务处理逻辑部分的功能是进行具体的运算和数据的处理;数据处理逻辑部分的功能是对数据库中的数据进行查询、修改和更新等。如(下图)。

此次本人做的是基于java开发的聊天室项目,客户端负责发送命令,服务端接收的命令后对语句进行操作,然后把结果返回给指定用户。多线程则实现了客户端可以设置为两个,这样在运行时,可以打开两个客户端,然后A用户输入的语句可以通过服务器发送到B客户端的界面上,实现两个客户端之间的通信。具体的过程是:如有用户聊天,服务器会显示出聊天信息。服务器端和客户端可以互相发送和接收信息,还可以查看聊天记录。如果服务器还没有启动,则客户端是不可以利用聊天室收发信息的。

总结客户端和服务端的任务:

1、服务器负责数据管理及程序处理。

2、客户机负责界面描述和界面显示。

3、客户机向服务器提出处理要求。

4、服务器响应将处理结果返回客户机。

5、使网络数据流量最少。

 

 

 

 

五、总结

在Client/Server结构的系统中,应用程序分为客户端和服务器端两大部分。客户端部分为每个用户所专有,而服务器端部分则由多个用户共享其信息与功能。客户端部分通常负责执行前台功能,如管理用户接口、数据处理和报告请求等;而服务器端部分执行后台服务,如管理共享外设、控制对共享数据库的操作等。这种体系结构由多台计算机构成,它们有机地结合在一起,协同完成整个系统的应用,从而达到系统中软、硬件资源最大限度的利用。

这次实验经过不懈的努力,最终程序基本满足聊天的需要,尤其在调试改写多线程的过程中,我遇到了很大的问题,发现自己之前的知识像一盘散沙,基础知识可能有涉猎,但是在实际应用的过程中却不断碰壁,我们需要更多的实践机会,来增强解决实际问题的能力。java编程技术还需要深入的认识,对其工作方式和原理还需要透彻的学习。而且这个专题选用的是C/S体系结构,其实课本中或者是实践中还有更多种类的体系结构,需要我们去仔细的学习,掌握并且能够清晰的辨析出每种体系结构的特点,合理的应用在实践项目中,是编好程序的第一步!

 

 

 

 

 

 

实验成绩:          指导教师:              

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值