关于socket通信的一个例子!

      最近私底下接了个活,忙晕了,都好久没来这里了,几乎要遗忘了!看了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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值