最近私底下接了个活,忙晕了,都好久没来这里了,几乎要遗忘了!看了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(); } }
}