Package cn.com.zjtelecom.smgp.server

Source Code of cn.com.zjtelecom.smgp.server.ServerHandleConnect

package cn.com.zjtelecom.smgp.server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;

import cn.com.zjtelecom.smgp.bean.Deliver;
import cn.com.zjtelecom.smgp.bean.Login;
import cn.com.zjtelecom.smgp.bean.Submit;
import cn.com.zjtelecom.smgp.message.ActiveTestMessage;
import cn.com.zjtelecom.smgp.message.ActiveTestRespMessage;
import cn.com.zjtelecom.smgp.message.DeliverMessage;
import cn.com.zjtelecom.smgp.message.ExitRespMessage;
import cn.com.zjtelecom.smgp.message.LoginMessage;
import cn.com.zjtelecom.smgp.message.LoginRespMessage;
import cn.com.zjtelecom.smgp.message.Package;
import cn.com.zjtelecom.smgp.message.SubmitMessage;
import cn.com.zjtelecom.smgp.message.SubmitRespMessage;
import cn.com.zjtelecom.smgp.protocol.RequestId;
import cn.com.zjtelecom.smgp.server.result.LoginResult;
import cn.com.zjtelecom.smgp.server.result.SubmitResult;
import cn.com.zjtelecom.util.DateUtil;
import cn.com.zjtelecom.util.Hex;

public class ServerHandleConnect extends Thread {
  private Socket clientsocket;

  private String ipaddress;
  private String account;
  private int loginMode = 0;

  private DataInputStream in;
  private DataOutputStream out;
  private Server serversim;
  private Long LastActiveTime;
  private int TimeOut;

  private boolean hasLogin = false;

  public ServerHandleConnect(Server server, Socket socket, int timeout) {

    this.serversim = server;
    this.clientsocket = socket;
    this.TimeOut = timeout;
  }

  public void run() {
    try {
      this.clientsocket.setSoTimeout(this.TimeOut * 1000);
      this.in = new DataInputStream(this.clientsocket.getInputStream());
      this.out = new DataOutputStream(this.clientsocket.getOutputStream());
      do {
        int PackLen = in.readInt();

        if (PackLen > 2500)
          exit(); // ������Ȳ���

        byte[] Message = new byte[PackLen - 4];
        in.read(Message);

        this.LastActiveTime = DateUtil.getTimeStampL();
        // debug
        // System.out.println(Hex.rhex(Message));
        Package mpackage = new Package(Message);

        // ���ò���
        int SequenceId = mpackage.SequenceId;

        if (this.hasLogin || mpackage.ReqestId == RequestId.ActiveTest
            || mpackage.ReqestId == RequestId.ActiveTest_Resp
            || mpackage.ReqestId == RequestId.Login) {
          switch (mpackage.ReqestId) {
          case (0x00000001):
            // login
            LoginMessage loginMessage = new LoginMessage(Message);
            // login��Ҫ���������صIJ���
            this.ipaddress = this.clientsocket
                .getRemoteSocketAddress().toString();
            if (this.ipaddress.indexOf("/") == 0) {
              this.ipaddress = this.ipaddress.substring(1);
            }
            if (this.ipaddress.indexOf(":") > 0) {
              this.ipaddress = this.ipaddress.substring(0,
                  this.ipaddress.indexOf(":"));
            }

            byte[] AuthenticatorClient = loginMessage
                .getAuthenticatorClient();
            Login login = new Login(loginMessage, this.ipaddress);

            LoginResult loginresult = this.serversim.onLogin(login,
                this);
            LoginRespMessage loginRespMessage = new LoginRespMessage(
                SequenceId, loginresult.getStatus(),
                AuthenticatorClient, loginresult.getShareKey(),
                loginresult.getServerVersion());
            SendBuf(loginRespMessage.getBuf());

            // �����Ѿ�����
            if (loginresult.getStatus() == 0) {

              this.account = login.Account;
              this.hasLogin = true;
              this.setLoginMode(login.LoginMode);
            } else {
              // ��¼ʧ��
              this.exit();
            }
            break;
          case (0x00000002):
            // submit
            SubmitMessage submitMessage = new SubmitMessage(Message);
            Submit submit = submitMessage.getSubmit();
            SubmitResult submitResult = this.serversim.onSumit(
                submit, this.account);
            SubmitRespMessage submitRespMessage = new SubmitRespMessage(
                SequenceId, submitResult.getStatus(),
                submitResult.getMsgID());
            SendBuf(submitRespMessage.getBuf());
            break;
          case (0x00000004):
            // ActiveTest
            ActiveTestRespMessage activeTestRespMessage = new ActiveTestRespMessage(
                SequenceId);
            SendBuf(activeTestRespMessage.getBuf());
            break;
          case (0x00000006):
            // Exit
            ExitRespMessage exitRespMessage = new ExitRespMessage(
                SequenceId);
            SendBuf(exitRespMessage.getBuf());
            break;
          case (0x80000003):
            // Deliver_Resp,����Ҫ����
            break;
          case (0x80000004):
            // Active_Resp,����Ҫ����
            break;
          }
        } else {
          // �Ƿ�����
          System.out.println("Package Error!");
          exit();
        }

      } while (true);
    } catch (SocketException e) {
      System.out.println("Client has close socket connect!");
      exit();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      System.out.println("Client Exit !");
      exit();
    }

  }

  public void SendDeliver(Deliver deliver) {
    DeliverMessage dlm = new DeliverMessage(deliver);
    try {
      SendBuf(dlm.getBuf());
    } catch (IOException e) {
      // TODO Auto-generated catch block
      exit();
    }
  }

  public void ActiveTest() {
    this.checkConnect();
    if (this.hasLogin) {
      ActiveTestMessage activeTestMessage = new ActiveTestMessage();
      try {
        SendBuf(activeTestMessage.getBuf());
      } catch (IOException e) {
        // System.out.println("Active Test Error!");
        exit();
      }
    }
  }

  private void checkConnect() {
    if ((DateUtil.getTimeStampL() - this.LastActiveTime) > this.TimeOut * 1000) {
      exit();
    }

  }

  private void exit() {
    if (this.hasLogin) {
      this.serversim.disconnect(this.account, this.ipaddress, this);
    } else {
      this.serversim.disconnect(this);
    }
  }

  private synchronized void SendBuf(byte[] buf) throws IOException {
    this.out.write(buf);
  }

  public void setLoginMode(int loginMode) {
    this.loginMode = loginMode;
  }

  public int getLoginMode() {
    return loginMode;
  }

  public String getIpaddress() {
    return ipaddress;
  }

  public String getAccount() {
    return account;
  }
}
TOP

Related Classes of cn.com.zjtelecom.smgp.server.ServerHandleConnect

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.