最近私底下接了个活,忙晕了,都好久没来这里了,几乎要遗忘了!看了http://www.acloudblog.blog.sohu.com/的blog才想起把最近所学到的写在这里,一个给自己做个记号,再个供大家参考一下。接的这个活是对ccproxy进行扩展,以方便用户使用,和给管理员提供一个方便快捷的管理平台!可惜做到今天还是没办法往下做了
因为ccproxy都是用ini文件来保存用户信息的,这就涉及到远程通信的问题了!开始打算用URL来做的,后来发现只能读远程,不能写远程(查了资料好象有写方法,但是自己没有试验成功,另外如果用url,还必须每个服务器都要建个站点),所以选择用socket来做!刚毕业没多久,学校里很少接触过通信的内容,做起来真是没有头绪
功能点:用户登录 用户切换代理 管理员后台管理(包括添加 查询 删除 修改)
整体思路是:在每个代理服务器上开个监听程序,用来接受用户的登录信息,切换代理信息,接到信息后就开个线程来进行相应的处理
监听代码:
import java.net.*;
import java.io.*;
public class ChatServer extends Thread {
private Socket fromClient=null;//主机与客户机的通信套节字:fromClient
private static boolean listening=true;
private ObjectInputStream ois=null;
private ObjectOutputStream oos=null;
public ChatServer(Socket client){
fromClient=client;
}
public static void main(String[] args) {
int port = 10000; //建立通信的主机的端口号
ServerSocket socServer = null;
int i=0;
try{
socServer = new ServerSocket(port);
while(listening){
Socket Client=socServer.accept();
new ChatServer(Client).start();
}
} catch (IOException e) {
System.err.println("Could not listen on port: "+port);
System.exit(1);
}
}
public void run(){
try{
ois=new ObjectInputStream(fromClient.getInputStream());
oos=new ObjectOutputStream(fromClient.getOutputStream());
//对客户端传过来的数据进行处理
String mess=(String)ois.readObject();
System.out.println("客户端传过来的数据是:"+mess);
String []data=mess.split(",");
CommonMethod oper=new CommonMethod();
if(mess!=null&&data[0].equals("add")){ //添加用户
oper.IniFile("D://ftp-date//AccInfo.ini");
UserInfo user=new UserInfo();
AcceptParPro par=new AcceptParPro();
user=par.process(data);
oper.addUserInfo(user);
oper.save2();
}
if(data[0].equals("del")){ //删除用户
oper.IniFile("D://ftp-date//AccInfo.ini");
oper.delSection(data[1]);
oper.save2();
}
if(data[0].equals("login")){ //验证登录("login"+","+loginIP+","+username+","+password)
oper.IniFile("D://ftp-date//AccInfo.ini");
String loginresult=oper.getUser(data[1],data[2],data[3]);
oos.writeObject(loginresult);
}
ois.close();
oos.close();
fromClient.close();//关闭套节字前要关闭所有的流连接
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
主服务器上的代码:
public class DelegateOper {
String addpath=null;
String delpath=null;
UserInfo user=null;
//登录验证
public String login(String loginIP,String username,String password){
String loginmessage="login"+","+loginIP+","+username+","+password;
String loginresult=null;
int port=10000;
Socket socket=null;
try{
socket=new Socket(loginIP,port);
//将登录信息发送到服务器端
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(loginmessage);
//接受服务器端的验证结果
ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
loginresult=(String)ois.readObject();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch(ClassNotFoundException e){
e.printStackTrace();
}
return loginresult;
}
//通过socket把数据从客户端写到服务端(在每个代理上都开一个socket用来监听数据)
public void addUser(String serverip,UserInfo user){
String message="客户端向服务段写数据:增加";
String addmessage="add"+","+user.getSection()+","+user.getUserName()+","+user.getPassword()+","+user.getMACAddress()+","+user.getIPAddressLow()+","+
user.getIPAddressHigh()+","+user.getServiceMask()+","+user.getMaxConn()+","+user.getBandWidth()+","+
user.getWebFilter()+","+user.getTimeSchedule()+","+user.getEnableUserPassword()+","+
user.getEnableIPAddress()+","+user.getEnableMACAddress()+","+user.getEnable()+","+user.getBelongsGroup()+","+
user.getBelongsGroupName()+","+user.getIsGroup()+","+user.getAutoDisable()+","+user.getDisableDateTime();
int port=10000;
Socket socket=null;
try{
socket=new Socket(serverip,port);
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(addmessage);
oos.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//添加用户信息到本机,不用Socket
public void addUserLocal(UserInfo user){
try{
CommonMethod oper=new CommonMethod();
oper.IniFile("D://ftp-date//CCProxy//AccInfo.ini");
oper.addUserInfo(user);
oper.save2();
}catch(Exception e){
e.printStackTrace();
}
}
//增加完数据后再删除
public void delUser(String loginIP,UserInfo user){
String message="客户端向服务器写数据:删除";
String delmessage="del"+","+user.getSection();
int port=10000;
Socket socket=null;
try{
socket=new Socket(loginIP,port);
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(delmessage);
oos.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//删除本机上的数据
public void delUserLocal(UserInfo user){
try{
String section=user.getSection();
CommonMethod oper=new CommonMethod();
oper.IniFile("D://ftp-date//CCProxy//AccInfo.ini");
oper.delSection(section);
oper.save2();
}catch(Exception e){
e.printStackTrace();
}
}
}