关于socket通信的一个例子!

    技术2022-05-11  104

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

    }

     


    最新回复(0)