Package org.ictclas4j.run

Source Code of org.ictclas4j.run.SegmentService

package org.ictclas4j.run;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import org.apache.log4j.Logger;
import org.ictclas4j.bean.DictLib;
import org.ictclas4j.bean.SegResult;
import org.ictclas4j.remote.CmdID;
import org.ictclas4j.remote.MsgPack;
import org.ictclas4j.remote.SegRequest;
import org.ictclas4j.segment.Segment;


/**
* ����Զ�̷ִ��������
*
* @author sinboy
* @since 2007.6.28
* @updated 2008.7.2
*
*/
public class SegmentService extends Thread {

  private DictLib dictLib;

  private Socket client;

  private DataInputStream in;

  private DataOutputStream out;

  static Logger logger = Logger.getLogger(SegmentService.class);

  public SegmentService(DictLib dictLib, Socket client) {
    this.dictLib = dictLib;
    this.client = client;
    if (this.client != null)
      try {
        client.setSoTimeout(10 * 60000);// 10����û����Ӧ����Ϊ��ʱ
        out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
        in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
      } catch (IOException e) {
        logger.error(e);
        close();
      }
  }

  public void run() {
    while (true) {
      try {
        byte[] bs = null;
        int len = in.readInt();
        if (len > 5) {
          byte cmdID = in.readByte();
          switch (cmdID) {
          case CmdID.SEG_REQUEST:
            bs = new byte[len - 5];
            in.read(bs);
            segRequest(bs);
            break;

          }
        }
      } catch (IOException e) {
        logger.error("conn with client is invalid", e);
        close();
        break;
      }
    }
  }

  private void segRequest(byte[] bs) {
    if (bs != null && out != null) {
      SegRequest req = new SegRequest(bs);
      String content = req.getContent();
      SegResult sr = getSeg(content);

      try {
        MsgPack pack = new MsgPack(CmdID.SEG_RESPONSE, sr);
        out.write(pack.getBytes());
        out.flush();
      } catch (IOException e) {
        logger.error("segment request", e);
        close();
      }

    }
  }

  private SegResult getSeg(String content) {
    SegResult result = null;

    // first, read from cache
    result = dictLib.getCachedSeg(content);
    // then,segment factly
    if (result == null) {
      Segment seg = new Segment(dictLib, 1);
      seg.setOutputMidResult(true);
      seg.setRecogniseUnknown(true);
      result = seg.split(content);

      // cache it
      if (result != null) {
        dictLib.addCachedSeg(content, result);
      }
    }
    return result;
  }

  private void close() {
    try {
      if (in != null)
        in.close();
      if (out != null)
        out.close();
      if (client != null)
        client.close();
    } catch (IOException e) {
      logger.error("Can't close the input stream or output stream or connection", e);
    }
  }
}
TOP

Related Classes of org.ictclas4j.run.SegmentService

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.