资源描述
数据挖掘系统Data Mining System系 统 准 备 说 明撰写人:组 号:组 长:组 员: 完成日期:1、背景32、知识准备32.1 C/C+32.1.1、C 语言32.1.2、C+32.1.3、准备32.2 socket 网络编程42.2.1、通信原理42.2.2、基本流程42.2.3、使用的接口42.2.4、准备52.3多线程52.3.1、Qt线程的创建52.3.2、线程同步52.4 QT62.4.1、信号和槽的原理62.4.2、信号和槽的关联62.4.3、界面72.5数据库72.5.1、连接数据库72.5.2、创建数据库的基本操作72.5.2、准备82.6 J2EE82.6.1、创建web工程82.6.2、导航82.6.3、受管 Bean82.6.4、远程操作数据库92.7生产者消费者问题92.7.1、问题描述92.7.2、解决9基于UC的数据挖掘系统的业务背景为:有一个Unix实验室出租业务,该 业务主要是用户向电信运营商申请一个Unix帐号,就可以远程登录Unix实验室, 并使用Unix系统。当然,用户使用电信运营商提供的Unix实验室的服务需要缴 纳一定的费用,电信运营商需要一套数据采集系统,把用户登录实验室的时间长 度数据采集起来并将数据发送到总部,便于在指定的时间范围内作为对用户的收 费依据。故在本项目中需要用到的知识有:C/C+、网络编程技术、多线程技术、QT 技术、数据库技术、J2EE技术以及生产者消费者模型。2、系统准备2.1 C/C+整个项目使用C/C+编写。2.1.1、 C 语言c语言语法简单,内容基础,外加平时使用较多,所以在这块简单复习即可重新掌握相 关函数、语法。windows下的C和Linux下的是有区别的,虽然C语言标准都一样,但在不 同的操作系统中有不同的系统API调用,代码编写、调试、编译也不同,习惯 了使用codeblocks的我们要学习Linux下的编译环境,包括用什么编辑代码、怎 样调试、怎样编译运行,特别要学习与windows系统下不一样的东西,如多线 程等。2.1.2、C+C+大一的时候学过,但平时编程的时候并不常用遗忘了很多,需要从基础 的语法学起,重新掌握。2.1.3、准备为熟悉C/C+,使用C语言编写了猜数字游戏、发扑克、五子棋、链表等 程序,并不断提出新要求提高程序难度;使用C+根据现有设计文档完成企业管 理系统,通过这些程序很好的复习了以前的知识,特别是通过企业管理系统对 C+基础语法有了全面的复习。2.2 socket网络编程客户端与服务器之间的通信是通过socket来实现的,需要学习socket编程 的基本流程,所使用的接口、函数等。2.2.1、通信原理1、服务器端步骤:(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息, 并建立与客户端之间的连接。(3)当完成通信后,服务器关闭与客户端的Socket连接。2、客户端的步骤如下。(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。(2)发送连接请求到服务器,并等待服务器的回馈信息。(3)连接成功后,与服务器进行数据的交互。(4)数据处理完毕后,关闭自身的Socket连接。222、基本流程接收信息和发送信息Soc ke i () 建立流式荏接字Send ()和Re” () 发送信息和接收信息Socket () 建立流式套接字Connect () 与远端服务器连接服务器端Close 关闭套接字客户端Bind ()配置本地端口和IP1、Accecpt ()2.救受使用的接建立连接IL i s t en () 监听和接收服务器请求Rind ( 配置本地的端口和IPClose 关闭套接字、#include #include int socket(int domain, int type, int protocol);2、bind()函数:int bind(int sockfd, struct sockaddr *my_addr, int addrlen);sockfd是调用socket返回的文件描述符。my_addr是指向数据结构 struct sockaddr的指针,它保存你的地址(即端口和IP地址)信息。addrlen 设置为 sizeof(struct sockaddr) o3、connect()函数:int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);sockfd是系统调用socket()返回的套接字文件描述符。serv_addr是 保 存着目的地端口和IP地址的数据结构struct sockaddro addrlen设置为 sizeof(struct sockaddr)o2.2.4、准备实现一个文本聊天程序,向同祖者发送文本,同组者接收到消息后可以回复文本。客户 端两两通信,通过服务器把一个客户端的消息转发到另一个客户端,服务器可以同时供多组 用户使用。2.3多线程由于是多个客户端向服务器发送信息,所以服务器端需要用到多线程的问 题,如何利用互斥量实现对共享缓冲池的访问问题(锁定和解锁的过程)。2.3.1、Qt线程的创建Qt线程中有一个公共的抽象类,所有的线程都是从这个QThread抽象类中 派生的,要实现QThread中的纯虚函数run(),run()函数是通过start()函数来 实现调用的。2.3.2、线程同步多个线程在运行的时候,可以看作是并行的。当线程之间有共享数据时,为 了使得数据状态能够保持连贯性而不被破坏,需要使用线程同步来保护某数据或 者某段代码(即把某数据的存取或者某段代码的执行由并行变成串行,从而达到 保护的目的)。而线程中对数据或代码的保持一般使用“锁”(在QT中叫mutex) 来把它们“锁”住,使得在每个时刻这个数据/代码只能被一个线程访问。QT中的mutex使用有下面几种:QMutex :提供相互排斥的锁,或互斥量QMutexLocker:自动对QMutex加锁与解锁QReadWriteLock:提供了一个可以同时读操作的锁QReadLocker / QWriteLocker:自动对 QReadWriteLock 加锁与解锁QSemaphore :提供了一个整型信号量,是互斥量的泛化2.4 QT需要使用QT为所做的系统编写界面,当接收到数据后需要在界面上显示出 来,了解丁的核心是信号和槽,了解它的机制。2.4.1、信号和槽的原理在Qt中我们有一种可以替代回调的技术。我们使用信号和槽,当一个特定 事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是 我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定 信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入 自己的槽,这样你就可以处理你所感兴趣的信号。2.4.2、信号和槽的关联通过调用QObject对象的connect函数来将某个对象的信号与另外一个对 象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函 数的定义如下:bool QObject:connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) static这个函数的作用就是将发射者sender对象中的信号signal与接收者 receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的 宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于 同一个对象的话,那么在connect调用中接收者参数可以省略。在每接收到一条数据后在界面及时显示中需要定义自己的信号和槽。2.4.3、界面QT有单独的界面创建方法,通过直接拖动相关组件即可完成,方便快捷。2.5数据库使用mysql数据库,要把所有的数据存储到数据库中,方便对之进行管理, 并整合出日报表、月报表、年报表,如何创建数据库,如何对之实现增、删、改、 查等操作。2.5.1、连接数据库mysql_real_connect 函数说明:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned intclient_flag)参数说明:1. Host:值可以是一个主机名或一个IP地址。如果host是NULL或字符串localhost, 假定是到本地主机的一个连接。2. User:参数包含用户的MySQL登录ID。如果user是NULL,假定是当前用户。在Unix 下,它是当前登录名。3. Passwd:参数为user包含口令。如果passwd是NULL,只有在user表中对于有一个空 白口令字段的用户的条目将被检查一个匹配。4. Db:是数据库名。5. Post:如果port不是0,值对于TCP/IP连接将用作端口号。注意host参数决定连接的 类型。6. unix_socket:如果unix_socket不是NULL,字符串指定套接字或应该被使用的命名管 道。7. client_flag:值通常是 0,2.5.2、创建数据库的基本操作1、创建一个名称为DMS的数据库:create database DMS;2、查看所有数据库:show databases;3、创建一个表(以其中一个为例):create table DailyReport(num int primary key auto_increment,userName varchar(20),totalTime varchar(32),dayDate varchar(32),LIP varchar(20),day varchar(32) NOT NULL);4、删除表中的内容:delete from DetailTable;5、插入一条数据Insert into table values();6、更新一条数据update employee set ;2.5.2、准备学生信息管理系统,实现对学生信息的增删改查。2.6 J2EE2.6.1、创建web工程1)右键创建Web工程2)为工程添加JSF支持右单击项目名称-Myeclipse-Add JSF Facelets, -finish3)创建包和类a. 建 DMS.JSF 包b. 建类Dboperate类:属于模型,数据库的增、删、改、查SelectBean类和LoginBean类:控制跳转,要为这些类的成员变量添加get()、set()方法, 同时添加此类的构造函数。2.6.2、导航打开配置文件“faces-config.xml”,添加web页面,本系统的页面有:1)登录页面Login.jsp2)选择页面Select.jsp3)日报表页面Day.jsp4)月报表页面Month.jsp5)年报表页面Year.jsp6)日报表查询明细表页面dayDetail.jsp7)月报表查询明细表页面monthDetail.jsp8)年报表查询明细表页面yearDetail.jsp2.6.3、受管 Bean1)在 “ faces-config.xml ” 页面的 “ outline ” 视图下右单击 ManagedBean,创建ManagedBean。(Scope 选 session; Class*写 cn.edu.jsf.UserBean; finish)2)设计UserBean的属性3)画jsp并写内容,连线(只用填写outcome)2.6.4、远程操作数据库Windows下的配置首先确定虚拟网卡开着.Host-Only方式的话,本地连接高级里允许共享上网打钩,家庭网 络连接选VM1,这时查看下WM1的属性,可以发现已经有IP及子网掩码,然后到虚拟机下主 菜单下找到网络,把IP地址改成与WM1里IP同一网段,子网掩码和WM1下的一样,默认网 关填WM1下的IP地址,DNS为物理机的DNS,然后重启虚拟机就OK 了.还可以通过桥 接,NAT配置来共享上网2.7生产者消费者问题2.7.1、问题描述该问题描述了两个共享固定大小缓冲区的线程一一即所谓的“生产者”和“消费者”一 一在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后 重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者 不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。2.7.2、解决要解决该问题,就必须让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数 据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空 时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用进程间通信的方 法解决该问题,常用的方法有信号灯法1等。如果解决方法不够完善,则容易出现死锁的 情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。
展开阅读全文