一、 功能
1. 定期采集radwtmp文件,整理成BIDR数据清单,将数据存储到数据库表t_detail_X(1-31)。
2. 使用技术:TCP/IP、JDBC。
二、 模块
客户端: 负责采集数据。
服务端: 负责接收数据。
客 户 端 |
配置模块 |
配置模块 |
服 务 端 |
日志模块 |
日志模块 |
||
采集模块 |
入库模块 |
||
备份模块 |
备份模块 |
||
网络模块 |
网络模块 |
三、 Jar包
1. BIDR类:用来分装采集好的数据。
2. 接口:
Gather接口客户端采集模块
负责采集指定文件中的数据。
eg: #briup1660|037:wKgB1660A|7|1239110900|44.211.221.247
#briup4418|037:wKgB4418A|7|1239138480|251.196.223.191
#用户名|NAS-IP|上线/下线|时间(秒)|IP地址
处理数据:
1. 读取行数据,通过IO流进行读取,
2. 采集数据情况:
第一种情况数据:用户上线了同时也下线了,
第二种情况数据:用户上线了但是还没有下线
3. 判断数据是上线(“7”),还是下线(“8”);
4. 用集合封装数据
第一种情况数据,封装好数据之后就传给服务器,第二种情况数据,进行数据的备份,在下一次的采集中,需要把备份的数据重新读出来使用(因为用户可能在下一次采集中下线了)。
5.第二次读取数据的时候,如何从第一次读完数据的下一行开始读,可以记录一下本次总共读取N个字节,下一次可以直接跳过N个字节,接着读。
6.在读取过程中或者处理过程中,如果出现了异常,需要把数据进行备份。
7.注意重要信息的日志记录。
Client端和Server端通过TCP/IP协议进行通信。
DBStore接口:入库模块
建表语句(oracle):
BEGIN
FOR i IN 1..31 LOOP
EXECUTE IMMEDIATE
'CREATE TABLE t_detail_'||TO_CHAR(i)||
'(
aaa_login_name VARCHAR2(30),
login_ip VARCHAR2(32),
login_date DATE,
logout_date DATE,
nas_ip VARCHAR2(32),
time_duration NUMBER(10)
)';
END LOOP;
END;
/
删除表语句:
BEGIN
FOR i IN 1..31 LOOP
EXECUTE IMMEDIATE
'DROP TABLE t_detail_'||TO_CHAR(i);
END LOOP;
END;
/
注意:最后的”/ ”,一定要写上,这是结束标识。
Logger接口:日志模块,负责记录系统运行过程中一些重要的信息。
知识点:
Configuration接口:配置模块
1.产生各个模块对象
2.读取各个模块所需的信息,并且把信息注入到每个模块中
注:这时候需要每个模块都实现接口WossModule。
3.如果某个模块A中需要用到配置模块,那么就需要把自己(因为自己就是配置模块)注入到这个模块A中。
注:这时候需要模块A实现接口ConfigurationAWare。
WossModule接口
例如:模块A中需要使用一些参数(比如读取xml的路径、连接数据的地址等等),模块A就需要实现WossModule接口,那么这个模块A就有一个方法:
init(Properties p)
将来我们就可以调用这个init方法,把数据注入到模块A中。
四.代码实现:
GatherImpl类:package com.briup.client;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.briup.common.BackupImpl;
import com.briup.common.LoggerImpl;
import com.briup.util.BIDR;
import com.briup.woss.client.Gather;
public class GatherImpl implements Gather{
FileInputStream fis=null;
BufferedReader br=null;
InputStreamReader isr=null;
Map<String, BIDR> map=null;
BackupImpl backup=new BackupImpl();
private static String filepath;
private static String nasp;
private static String logger;
@Override
public void init(Properties arg0) {
filepath= arg0.getProperty("src-file");
nasp = arg0.getProperty("nas-ip");
logger = arg0.getProperty("logger");
}
@Override
public Collection<BIDR> gather() throws Exception {
// #briup1660|037:wKgB1660A|7|1239110900|44.211.221.247
//Map<String, BIDR> map=new HashMap<String, BIDR>();
//读 文件
List<BIDR> list=new ArrayList<BIDR>();
Object load = backup.load("list", true);
if(load!=null){
Map<String, BIDR> m = (Map<String, BIDR>) backup.load("list", true);
map.putAll(m);
}
LoggerImpl log = (LoggerImpl) Class.forName(logger).newInstance();
br=new BufferedReader(new InputStreamReader(new FileInputStream(filepath)));
String str=null;
//以行为单位进行读取数据
while((str=br.readLine())!=null){
//以“|”进行截取字符串
String[] split=str.split("\\|");
//System.out.println(spilt[0]);
log.info("开始收集数据....");
//判断是上线还是下线
if("7".equals(split[2])){
BIDR bidrs=new BIDR();
bidrs.setAAA_login_name(split[0]);
bidrs.setNAS_ip(nasp);
bidrs.setLogin_date(new Timestamp(Long.parseLong(split[3])*1000));
bidrs.setLogin_ip(split[4]);
//map.put(split[4], bidrs);
list.add(bidrs);
}
else{
//BIDR b=map.get(split[4]);
for(BIDR o:list){
//
if(split[4].equals(o.getLogin_ip())&o.getLogin_date()!=null){
o.setLogout_date(new Timestamp(Long.parseLong(split[3])*1000));
//时间差
o.setTime_deration((int) (o.getLogout_date().getTime()-o.getLogout_date().getTime()));
//
}
}
}
}
//
int n=0;
for(int i=0;i<list.size();i++){
if(list.get(i).getLogout_date()==null){
backup.store("backup.txt", list.get(i), false);
list.remove(list.get(i));
n++;
}
}
System.out.println("数目为-------"+n);
return list;
}
}
ClientImpl类:
package com.briup.client;
import java.io.BufferedReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Collection;
import java.util.Properties;
import com.briup.util.BIDR;
import com.briup.woss.client.Client;
public class ClientImpl implements Client{
public static String port1;
public static String host1;
@Override
public void init(Properties pp) {
port1 = pp.getProperty("port");
host1 = pp.getProperty("ip");
}
@Override
public void send(Collection<BIDR> arg0) throws Exception {
Socket socket=null;
String host=host1;
int port=Integer.parseInt(port1);
ObjectOutputStream oos=null;
BufferedReader br=null;
socket=new Socket(host,port);
System.out.println("已经连接到服务器");
oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(arg0);
}
}
ServerImpl类:
package com.briup.server;
import java.util.List;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.Properties;
import com.briup.common.ConfigurationImpl;
import com.briup.common.LoggerImpl;
import com.briup.util.BIDR;
import com.briup.util.Configuration;
import com.briup.util.Logger;
import com.briup.woss.ConfigurationAWare;
import com.briup.woss.server.Server;
public class ServerImpl implements Server,ConfigurationAWare{
public static String port1;
//private static String logger;
LoggerImpl log;
@Override
public void init(Properties arg0) {
/* logger = arg0.getProperty("logger");
System.out.println(logger);
*/
port1 = arg0.getProperty("serverport");
}
@Override
public Collection<BIDR> revicer() throws Exception {
ServerSocket server=null;
int port=Integer.parseInt(port1);
Socket socket=null;
ObjectInputStream ois=null;
server=new ServerSocket(port);
System.out.println("服务器已经启动--");
log.info("server start...");
socket=server.accept();
ois=new ObjectInputStream(socket.getInputStream());
List<BIDR> list=(List<BIDR>) ois.readObject();
System.out.println(list.size());
ois.close();
socket.close();
server.close();
return list;
}
@Override
public void shutdown() {
}
@Override
public void setConfiguration(Configuration arg0) {
try {
log = (LoggerImpl) arg0.getLogger();
} catch (Exception e) {
e.printStackTrace();
}
}
}
DBStoreImpl类:package com.briup.server;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Properties;
import com.briup.client.GatherImpl;
import com.briup.common.ConfigurationImpl;
import com.briup.util.BIDR;
import com.briup.woss.server.DBStore;
public class DBStoreImpl implements DBStore{
private static String driver;
private static String url;
private static String user;
private static String password;
@Override
public void init(Properties arg0) {
driver=arg0.getProperty("driver");
url=arg0.getProperty("url");
user=arg0.getProperty("userName");
password=arg0.getProperty("passWord");
}
@Override
public void saveToDB(Collection<BIDR> arg0) throws Exception {
//#briup1660|037:wKgB1660A|7|1239110900|44.211.221.247
Connection conn=null;
PreparedStatement pst=null;
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
for(BIDR bidr:arg0){
SimpleDateFormat sdf= new SimpleDateFormat("dd");
String dateStr=sdf.format(bidr.getLogin_date());
int parseInt = Integer.parseInt(dateStr);
String string= "t_detail_"+parseInt;
String sql="insert into "+string+" values(?,?,?,?,?,?)";
pst=conn.prepareStatement(sql);
pst.setString(1, bidr.getAAA_login_name());
pst.setString(2, bidr.getNAS_ip());
pst.setTimestamp(3, bidr.getLogin_date());
pst.setTimestamp(4, bidr.getLogout_date());
pst.setString(5, bidr.getLogin_ip());
pst.setInt(6,bidr.getTime_deration());
pst.execute();
pst.close();
}
if(pst!=null)pst.close();
if(conn!=null)conn.close();
}
}
BackupImpl类:
package com.briup.common;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
import java.util.Properties;
import com.briup.util.BackUP;
public class BackupImpl implements BackUP{
private String filepath="src/com/briup/file";
@Override
public void init(Properties arg0) {
}
@Override
public Object load(String arg0, boolean flag) throws Exception {
File file=new File(filepath,arg0);
if(!file.exists()){
return null;
}
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
Object object = ois.readObject();
ois.close();
if(flag){
file.delete();
}
return object;
}
@Override
public void store(String arg0, Object arg1, boolean arg2) throws Exception {
File file=new File(filepath,arg0);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(arg1);
oos.flush();
oos.close();
}
}
LoggerImpl类
package com.briup.common;
import java.util.Properties;
import org.apache.log4j.PropertyConfigurator;
import com.briup.util.Logger;
public class LoggerImpl implements Logger{
//private static
private static String loggerName1;
public static org.apache.log4j.Logger log;
@Override
public void init(Properties arg0) {
loggerName1=arg0.getProperty("log-properties");
PropertyConfigurator.configure(loggerName1);
log=org.apache.log4j.Logger.getRootLogger();
}
@Override
public void debug(String arg0) {
log.debug(arg0);
}
@Override
public void error(String arg0) {
log.error(arg0);
}
@Override
public void fatal(String arg0) {
log.fatal(arg0);
}
@Override
public void info(String arg0) {
log.info(arg0);
}
@Override
public void warn(String arg0) {
log.warn(arg0);
}
}
ConfigurationImpl类:
package com.briup.common;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.briup.client.ClientImpl;
import com.briup.client.GatherImpl;
import com.briup.server.DBStoreImpl;
import com.briup.server.ServerImpl;
import com.briup.util.BackUP;
import com.briup.util.Configuration;
import com.briup.util.Logger;
import com.briup.woss.ConfigurationAWare;
import com.briup.woss.WossModule;
import com.briup.woss.client.Client;
import com.briup.woss.client.Gather;
import com.briup.woss.server.DBStore;
import com.briup.woss.server.Server;
public class ConfigurationImpl implements Configuration{
private static Properties pp;//存储配置信息初始化
static{
try {
SAXReader reader=new SAXReader();
File file=new File("src/com/briup/file/conf.xml");
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> list2 = root.elements();
pp=new Properties();
for(Element e2:list2){
String name = e2.getName();
String classvalue = e2.attributeValue("class");
pp.put(name, classvalue);
List<Element> list3 = e2.elements();
for(Element e3:list3){
pp.put(e3.getName(), e3.getText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public BackUP getBackup() throws Exception {
String property = pp.getProperty("backup");
Object newInstance = Class.forName(property).newInstance();
BackupImpl backupImpl=(BackupImpl) newInstance;
backupImpl.init(pp);
return backupImpl;
}
@Override
public Client getClient() throws Exception {
String clientp = pp.getProperty("client");
ClientImpl clientI = (ClientImpl) Class.forName(clientp).newInstance();
clientI.init(pp);
return clientI;
}
@Override
public DBStore getDBStore() throws Exception {
String dbp = pp.getProperty("dbstore");
DBStoreImpl dbI = (DBStoreImpl) Class.forName(dbp).newInstance();
dbI.init(pp);
return dbI;
}
@Override
public Gather getGather() throws Exception {
String gatherp = pp.getProperty("gather");
GatherImpl gatherI = (GatherImpl) Class.forName(gatherp).newInstance();
gatherI.init(pp);
return gatherI;
}
@Override
public Logger getLogger() throws Exception {
String loggerp = pp.getProperty("logger");
System.out.println(loggerp);
LoggerImpl loggerI = (LoggerImpl) Class.forName(loggerp).newInstance();
System.out.println(loggerI+"oooo");
loggerI.init(pp);
return loggerI;
}
@Override
public Server getServer() throws Exception {
String serverp = pp.getProperty("server");
ServerImpl serverI = (ServerImpl) Class.forName(serverp).newInstance();
serverI.init(pp);
return serverI;
}
总结:
老师带我们做了这个项目,我收获了很多,融汇了我之前学过的知识点,我就有个体会,学以致用,才能更好的理解。之前有些不懂的知识点也能更好的理解了。