<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>阿Q的家</title>
    <description></description>
    <link>http://yinhj.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>SendSM.java</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/198907" style="color:red;">http://yinhj.javaeye.com/blog/198907</a>&nbsp;
          发表时间: 2008年05月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package com.msp.smg;

import org.apache.log4j.Logger;

public class SendSM {
	private final static Logger logger = Logger.getLogger(SendSM.class);
	private String sourceAddr;
	private String descAddr;
	private String shortMessage;

	public String getSourceAddr() {
		return sourceAddr;
	}

	public void setSourceAddr(String sourceAddr) {
		this.sourceAddr = sourceAddr;
	}

	public String getDescAddr() {
		return descAddr;
	}

	public void setDescAddr(String descAddr) {
		this.descAddr = descAddr;
	}

	public String getShortMessage() {
		return shortMessage;
	}

	public void setShortMessage(String shortMessage) {
		this.shortMessage = shortMessage;
	}

	@Override
	public String toString() {
		return "sourceAddr=" + sourceAddr + ",descAddr=" + descAddr
				+ ",shortMessage" + shortMessage;
	}

}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/198907#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 31 May 2008 09:54:16 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/198907</link>
        <guid>http://yinhj.javaeye.com/blog/198907</guid>
      </item>
      <item>
        <title>config.properties</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/197020" style="color:red;">http://yinhj.javaeye.com/blog/197020</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">#smpp config
G_SMPP.name=G_SMPP
G_SMPP.smscIP=127.0.0.1
G_SMPP.smscPort=5016
G_SMPP.smscSystemId=user0
G_SMPP.smscPassword=user0
G_SMPP.smscRequestCount=20

C_SMPP.name=C_SMPP
C_SMPP.smscIP=192.168.0.1
C_SMPP.smscPort=5017
C_SMPP.smscSystemId=user1
C_SMPP.smscPassword=user1
C_SMPP.smscRequestCount=10</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/197020#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 13:26:11 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/197020</link>
        <guid>http://yinhj.javaeye.com/blog/197020</guid>
      </item>
      <item>
        <title>spring_smpp.xml</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/197019" style="color:red;">http://yinhj.javaeye.com/blog/197019</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
&lt;beans&gt;
	&lt;bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;
		&lt;property name="locations"&gt;
			&lt;list&gt;
				&lt;value&gt;classpath:config.properties&lt;/value&gt;
			&lt;/list&gt;
		&lt;/property&gt;
	&lt;/bean&gt;

	&lt;bean id="G_SMPP" class="com.msp.smg.SMPPService" init-method="startSender"&gt;
		&lt;property name="smscIP" value="${G_SMPP.smscIP}" /&gt;
		&lt;property name="smscPort" value="${G_SMPP.smscPort}"&gt;&lt;/property&gt;
		&lt;property name="sysId" value="${G_SMPP.smscSystemId}"&gt;&lt;/property&gt;
		&lt;property name="syspwd" value="${G_SMPP.smscPassword}"&gt;&lt;/property&gt;
		&lt;property name="smscRequestCount"  value="${G_SMPP.smscRequestCount}"&gt;&lt;/property&gt;
		&lt;property name="smscName"  value="${G_SMPP.name}"&gt;&lt;/property&gt;		
	&lt;/bean&gt;

	&lt;bean id="C_SMPP" class="com.msp.smg.SMPPService" init-method="startSender"&gt;
		&lt;property name="smscIP" value="${C_SMPP.smscIP}" /&gt;
		&lt;property name="smscPort" value="${C_SMPP.smscPort}"&gt;&lt;/property&gt;
		&lt;property name="sysId" value="${C_SMPP.smscSystemId}"&gt;&lt;/property&gt;
		&lt;property name="syspwd" value="${C_SMPP.smscPassword}"&gt;&lt;/property&gt;
		&lt;property name="smscRequestCount"  value="${C_SMPP.smscRequestCount}"&gt;&lt;/property&gt;
		&lt;property name="smscName"  value="${C_SMPP.name}"&gt;&lt;/property&gt;		
	&lt;/bean&gt;
	
&lt;/beans&gt;</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/197019#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 13:25:16 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/197019</link>
        <guid>http://yinhj.javaeye.com/blog/197019</guid>
      </item>
      <item>
        <title>StartUp.java</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/197017" style="color:red;">http://yinhj.javaeye.com/blog/197017</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package com.msp.smg;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StartUp {


	public static void main(String[] args) {
		System.out.println("SMG Server start ...");
		new ClassPathXmlApplicationContext(new String[] {"spring_smpp.xml"});
		System.out.println("SMG Server start success.");
	}

}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/197017#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 13:24:23 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/197017</link>
        <guid>http://yinhj.javaeye.com/blog/197017</guid>
      </item>
      <item>
        <title>SMPPService.java</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/197016" style="color:red;">http://yinhj.javaeye.com/blog/197016</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package com.msp.smg;

public class SMPPService {
	private String sysId = "";
	private String syspwd = "";
	private String smscIP = "";
	private int smscPort = 0;
	private int smscRequestCount = 1;
	private String smscName="";
	
	public void setSmscName(String smscName) {
		this.smscName = smscName;
	}
	public SMPPService()
	{
		
	}
	public void setSmscIP(String smscIP) {
		this.smscIP = smscIP;
	}

	public void setSmscPort(int smscPort) {
		this.smscPort = smscPort;
	}

	public void startSender() {

		RequestWorker requestWorker;

		for (int i = 0; i &lt; smscRequestCount; i++) {
			requestWorker = new RequestWorker();
			requestWorker.setSmscIP(smscIP);
			requestWorker.setSmscPort(smscPort);
			requestWorker.setSysId(sysId);
			requestWorker.setSyspwd(syspwd);
			requestWorker.start();
			System.out.println("smscName="+smscName+",index="+i);

		}

	}
	public void setSmscRequestCount(int smscRequestCount) {
		this.smscRequestCount = smscRequestCount;
	}

	public void setSysId(String sysId) {
		this.sysId = sysId;
	}

	public void setSyspwd(String syspwd) {
		this.syspwd = syspwd;
	}
}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/197016#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 13:23:33 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/197016</link>
        <guid>http://yinhj.javaeye.com/blog/197016</guid>
      </item>
      <item>
        <title>RequestWoker.java</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/197013" style="color:red;">http://yinhj.javaeye.com/blog/197013</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package com.msp.smg;

import java.util.List;

import org.apache.log4j.Logger;
import com.logica.smpp.Connection;
import com.logica.smpp.Data;
import com.logica.smpp.Receiver;
import com.logica.smpp.Session;
import com.logica.smpp.TCPIPConnection;
import com.logica.smpp.pdu.BindRequest;
import com.logica.smpp.pdu.BindResponse;
import com.logica.smpp.pdu.BindTransmitter;
import com.logica.smpp.pdu.Response;
import com.logica.smpp.pdu.SubmitSM;
import com.logica.smpp.pdu.UnbindResp;
import com.msp.smg.Queue;

public class RequestWorker extends Thread {
	private final static Logger logger = Logger.getLogger(RequestWorker.class);
	private boolean isRuning = true;
	private boolean isConnectSMSC = false;
	private boolean isBound = false;
	private Session session = null;
	private String sysId = "";
	private String syspwd = "";
	private String smscIP = "";
	private int smscPort = 0;
	private Receiver receiver = null;
	ResponseWorker responseWorker = null;
	private List&lt;SendSM&gt; sendsmList;

	/**
	 * 连接到短信中心
	 */
	private void connectSMSC() {
		try {
			Connection conn = new TCPIPConnection(smscIP, smscPort);
			session = new Session(conn);
			isConnectSMSC = true;
		} catch (Exception ex) {
			isConnectSMSC = false;
			ex.printStackTrace();
		}

	}

	/**
	 * 实现绑定到短信中心的功能
	 */
	private void bindSMSC() {
		if (isConnectSMSC &amp;&amp; session != null) {
			try {
				BindRequest bindReq = new BindTransmitter();
				bindReq.setSystemId(sysId);
				bindReq.setPassword(syspwd);
				BindResponse bindResponse = null;

				bindResponse = session.bind(bindReq);

				if (bindResponse.getCommandStatus() == Data.ESME_ROK) {
					receiver = session.getReceiver();
					if (responseWorker == null) {
						responseWorker = new ResponseWorker();
					}
					responseWorker.setReceiver(receiver);
					responseWorker.start();
					isBound = true;
				} else {
					isBound = false;
				}

			} catch (Exception ex) {
				isBound = false;
				ex.printStackTrace();
			}
		} else {
			logger.info("连接到短信中心的connection失效！");
		}
	}

	public SendSM getSendSM() {
		SendSM sendsm = null;
		try {
			if (sendsmList != null &amp;&amp; sendsmList.size() &gt; 0) {
				sendsm = (SendSM) sendsmList.remove(0);
			}
		} catch (Exception e) {
			sendsm = null;
		}
		return sendsm;
	}

	public void run() {
		SendSM sendsm = null;
		while (isRuning) {
			try {

				// System.out.println("smscIP=" + smscIP + ",smscPort=" +
				// smscPort
				// + ",sysId=" + sysId + ",syspwd=" + syspwd);
				/*
				 * while (!isConnectSMSC) { this.connectSMSC(); } if (!isBound) {
				 * this.bindSMSC(); } while (isBound &amp;&amp; this.getSendSM() !=
				 * null) { sendShortMessage(sendsm); } ; this.unBind();
				 */
			} finally {
				isRuning = true;

			}
		}

	}

	/*
	 * 发送短信
	 */

	public void sendShortMessage(SendSM sendsm) {
		SubmitSM request = new SubmitSM();
		try {
			request.setSourceAddr(sendsm.getSourceAddr());
			request.setDestAddr(sendsm.getDescAddr());
			request.setShortMessage(sendsm.getShortMessage());
			session.submit(request);
			// getStatus(response);
		} catch (Exception e) {
			logger.info(e.getMessage(), e);
		}
	}

	public void unBind() {
		try {
			UnbindResp response = session.unbind();
			getStatus(response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void getStatus(Response response) {
		if (response.getCommandStatus() == Data.ESME_ROK) {
			//
		} else {

		}
	}

	public void setSmscIP(String smscIP) {
		this.smscIP = smscIP;
	}

	public void setSmscPort(int smscPort) {
		this.smscPort = smscPort;
	}

	public void setSysId(String sysId) {
		this.sysId = sysId;
	}

	public void setSyspwd(String syspwd) {
		this.syspwd = syspwd;
	}
}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/197013#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 13:22:20 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/197013</link>
        <guid>http://yinhj.javaeye.com/blog/197013</guid>
      </item>
      <item>
        <title>ResponseWorker.java</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/197011" style="color:red;">http://yinhj.javaeye.com/blog/197011</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package com.msp.smg;

import com.logica.smpp.Receiver;
import com.logica.smpp.pdu.*;
import com.logica.smpp.*;

public class ResponseWorker extends Thread {

	private boolean isRuning = true;
	private Receiver receiver = null;
	private PDU pdu = null;

	public Receiver getReceiver() {
		return receiver;
	}

	public void setReceiver(Receiver receiver) {
		this.receiver = receiver;
	}

	public void run() {
		while (isRuning) {
			try {
				pdu = receiver.receive(1000);
				while (pdu != null) {
					switch (pdu.getCommandId()) {
					case Data.SUBMIT_SM_RESP:
						long sequenceNumber = pdu.getSequenceNumber();
						break;
					case Data.BIND_TRANSCEIVER_RESP:
						break;
					}
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			} finally {
				isRuning = true;
			}
		}
	}

}
</pre>
<p>&nbsp;截止到2008年5月26日的代码</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/197011#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 13:21:05 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/197011</link>
        <guid>http://yinhj.javaeye.com/blog/197011</guid>
      </item>
      <item>
        <title>2007年工作总结之-xx省UNICOM dxt互通短信网关系统SMSC</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/161131" style="color:red;">http://yinhj.javaeye.com/blog/161131</a>&nbsp;
          发表时间: 2008年02月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>08年了，我也把07年所做的工作总结一下。望各位朋友不吝指教。</p><p>&nbsp;</p><p>一、名词解释</p><p>SMPP：短消息点对点协议，SMPP协议是一个国际标准，有SMS论坛制定，官方网址为smsforum.net，截至2006年7月2日，最新版本是5.0。曾经流行的版本是3.3、3.4。SMPP协议向后兼容的。<br />SMC：<span style="font-size: 12pt; font-family: 宋体"><span style="font-size: x-small">短消息服务中心</span></span><br />ECME：<span style="font-size: 12pt; font-family: 宋体"><span style="font-size: x-small">扩展短消息实体</span></span></p><p>&nbsp;</p><p>二、简要介绍<br />基于SMPP协议研发的互通短信网关，所有unicom发向中国移动和中国电信的短信都通过此系统提交给unicom互通短信网关，系统角色为SMC，unicom充当ECME，由SMSC主动下发短消息(DeliverSM)给unicom短信中心，设计速度为250条/秒（运营商规定）。 </p><p><br />系统采用spring进行ioc配置，h2内存数据库，数据库访问采用spring jdbc，基于多线程和Socket编程。 </p><p>主要程序介绍：</p><p>&nbsp;</p><p>三、主体程序介绍<br /><strong>SMSCService</strong>：系统启动的主程序，实现启动、暂停监听服务，启动暂停消息下发服务功能。 </p><pre name="code" class="java">		while (keepRunning) {
			System.out.println();
			System.out.println(&quot;- 1 start listener&quot;);
			System.out.println(&quot;- 2 stop listener&quot;);
			System.out.println(&quot;- 3 client&quot;);
			System.out.println(&quot;- 4 start deliverMessage&quot;);
			System.out.println(&quot;- 5 stop deliverMessage&quot;);
			System.out.println(&quot;- 0 exit&quot;);
			System.out.print(&quot;&gt; &quot;);
			optionInt = -1;
			try {
				option = keyboard.readLine();
				optionInt = Integer.parseInt(option);
			} catch (Exception e) {
				optionInt = -1;
			}
			switch (optionInt) {
			case 1:
				startlistener();
				break;
			case 2:
				stoplistener();
				break;
			case 3:
				listclienter();
				break;
			case 4:
				startdeliverMessage();
				break;
			case 5:
				stopdeliverMessage();</pre><p><br /><br /><strong>SMSCListener</strong>：服务监听程序，当ECME连接上SMC后，生成SMSCSession。 </p><pre name="code" class="java">	public synchronized void start() throws IOException {
		debug.write(&quot;going to start SMSCListener on port &quot; + port);
		if (!isReceiving) {
			serverConn = new com.logica.smpp.TCPIPConnection(port);
			serverConn.setReceiveTimeout(getAcceptTimeout());
			serverConn.open();
			keepReceiving = true;
			if (asynchronous) {
				debug.write(&quot;starting listener in separate thread.&quot;);
				Thread serverThread = new Thread(this);
				serverThread.start();
				debug.write(&quot;listener started in separate thread.&quot;);
			} else {
				debug.write(&quot;going to listen in the context of current thread.&quot;);
				run();
			}
		} else {
			debug.write(&quot;already receiving, not starting the listener.&quot;);
		}
	}</pre><p>&nbsp;</p><pre name="code" class="java">		try {
			Connection connection = null;
			serverConn.setReceiveTimeout(getAcceptTimeout());
			connection = serverConn.accept();
			if (connection != null) {
				SMSCSession session = new SMSCSession(connection);
				session.setHashSet(hashSet);
				Thread thread = new Thread(session);
				thread.start();
				sessionFactory.register(session);				
				debug.write(&quot;SMSCListener launched a session on the accepted connection.&quot;);
			} else {
				debug.write(&quot;no connection accepted this time.&quot;);
			}
		} catch (InterruptedIOException e) {
			debug.write(&quot;InterruptedIOException accepting, timeout? -&gt; &quot; + e);
		} catch (IOException e) {
			event.write(e, &quot;IOException accepting connection&quot;);
			keepReceiving = false;
		}</pre><p><br /><strong>SMSCSession</strong>：实现ECME连接上来的消息解码，调度相应的服务（接受消息或发送消息）。 </p><pre name="code" class="java">				if (calendar.getTimeInMillis() &lt; (enquire_LinkTime + enquire_LinkTimeout * 1000)) {
					//判断是否连接超时
					try {
						debug.write(&quot;SMSCSession going to receive a PDU&quot;);
						pdu = receiver.receive(getReceiveTimeout());
					} catch (Exception e) {
						debug
								.write(&quot;SMSCSession caught exception receiving PDU &quot;
										+ e.getMessage());
					}
					if (pdu != null) {
						if (pdu.isRequest()) {
							debug.write(&quot;SMSCSession got request &quot;
									+ pdu.debugString());
							requestWorker.clientRequest((Request) pdu);
						} else if (pdu.isResponse()) {
							debug.write(&quot;SMSCSession got response &quot;
									+ pdu.debugString());
							requestWorker.clientResponse((Response) pdu);
						} else {
							debug
									.write(&quot;SMSCSession not reqest nor response =&gt; not doing anything.&quot;);
						}
					}
				}else
				{
					keepReceiving=false;
				}</pre><p><br /><strong>RequestWorker</strong>：处理ECME和SMC之间的消息，缋SUBMIT_SM,SUBMIT_MULTI,ENQUIRE_LINK等消息。 </p><pre name="code" class="java">					// TODO 根据业务规则进行用户合法性验证
					commandStatus = checkIdentity((BindRequest) request);
					if (commandStatus == 0) { // authenticated
						System.out.println(request.debugString());
						BindResponse bindResponse = (BindResponse) request
								.getResponse();
						serverResponse(bindResponse);
						// success =&gt; bound
						bound = true;
					} else { // system id not authenticated
						// get the response
						response = request.getResponse();
						// set it the error command status
						response.setCommandStatus(commandStatus);
						// and send it to the client via serverResponse
						serverResponse(response);
						// bind failed, stopping the session
						session.stop();
					}</pre><p><br /><strong>ResponseWorker</strong>：处理DELIVER_RESP消息，与发送消息的时间进行对比，实现超时重发和保存消息预处理。 </p><pre name="code" class="java">								if (isOutTime(sendsm.getDealTime())) {// dealTime如果没有填写，此时永远处理不到
									sendsm.setState(SendSM.STATE_SMSC_FAIL);
									reportFailQueue.put(sendsm, 100);
									//分类保存
									if (sendsm.getMessageType() == SendSM.MESSAGETYPE_CORP) {
										reportQueue.put(sendsm, 100);
									} else if (sendsm.getMessageType() == SendSM.MESSAGETYPE_CLIENT) {
										reportQueue_P.put(sendsm, 100);
									}
								} else {
									// 重新压回接收队列
									deliverQueue.put(sendsm, 100);
								}</pre><p><br /><strong>DeliverMessage</strong>：从发送队列里取出待发短信，提交DELIVERSM消息至RequestWorker，由RequestWorker下发消息至ECME. </p><pre name="code" class="java">					while (list != null &amp;&amp; list.size() &gt; 0) {
						try {
							sendsm = list.remove(list.size() - 1);
							if (sendsm != null) {
								deliverSM = this.convertSendsm(sendsm);
							} else {
								deliverSM = null;
							}
							if (deliverSM != null) {
								if (session.send(deliverSM)) {
									SMSCLog.SendLog(deliverSM);
									sendsm.setSequenceNumber(String
											.valueOf(deliverSM
													.getSequenceNumber()));
									sendsm.setDealTime(DataFormat.yyyy_MM_dd_HH_mm_ss
													.format(new Date()));
									deliverQueue.put(sendsm, 1000);
									
								}
							}
							Thread.sleep(intervalTime);
						} catch (Exception e) {
							log.error(e.getMessage(), e);
						}
					}</pre><p><br /><strong>SaveService</strong>：基于spring jdbc实现的批量取出消息和批量保存的DAO实现。 </p><pre name="code" class="java">				count = saveQueue.drainTo(list, batchSize);
				
				if (logger.isDebugEnabled()) {
					logger.debug(&quot;get element count[&quot;+count+&quot;] from saveQeueue.&quot;);
				}

				if (count &gt; 0) {
					int total = batchSave.batachSave(list);
					if (logger.isDebugEnabled()) {
						logger.debug(&quot;Save [&quot;+total+&quot;] records.&quot;);
					}
				} 
				
				if (count &lt; batchSize) {
					if (logger.isDebugEnabled()) {
						logger.debug(&quot;sleep &quot;+sleepTime);
					}
					//小于0, 休眠
					Thread.sleep(sleepTime);
				} else {
					Thread.yield(); //让其他程序有机会运行
				}</pre><p><br />其它若干辅助类，就不一一介绍了。 </p><p>&nbsp;</p><p>因为时间比较紧，系统是在logica smsc的基础修改完成的，本人1周完成。主是加入了业务所需要的东西。因涉及非技术问题，此处只取了一部份代码。</p><p>&nbsp;</p><p>ps:</p><p>做这个项目的时候，主要是为适应xx省smsc经过huiway改造之后的话单分检，大家开始都没有注意有可能出现这种情况，时间紧（大约只有1周时间），压力大（自己以前还没有smsc角色的程序,对smpp中的DeliverSM消息不太熟，后来果然在上面载了跟头，测试时总发现下发出去的消息是乱码，反复测试，编码格式也换了9种，后来才发现有个DeliverSM中的setDataCoding没有设置，郁闷），经过自己的努力和同事的帮助。基本上在一周内完成，包括测试用例。</p><p>现在这个系统已上线，到目前为止已正常运行2个月，从未出现过大问题。运行平台为redhat enterprise 4。</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/161131#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 02 Feb 2008 10:46:27 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/161131</link>
        <guid>http://yinhj.javaeye.com/blog/161131</guid>
      </item>
      <item>
        <title>“五子登科”新解之“票子，房子，车子，妻子，孩子”</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/150175" style="color:red;">http://yinhj.javaeye.com/blog/150175</a>&nbsp;
          发表时间: 2007年12月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">《宋史</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&middot;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">窦仪传》记载：宋代窦禹钧的五个儿子仪、俨、侃、偁、僖相继及第，故称</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&ldquo;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">五子登科</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&rdquo;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">。</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br />
</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">科举时代考上进士叫登科，一家五个儿子都功成名就就叫</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&ldquo;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">五子登科</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&rdquo;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">。不同时代的</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&ldquo;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">五子登科</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&rdquo;</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">有不同的含义，现代的五子是指什么呢？按顺序来说应该是：<strong><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">票子，房子，车子，妻子，孩子</span></strong>。当然这是站在男人的角度上说的，也是很多男人硬着头皮也要为之奋斗的目标，下面简单分析一下，也算闲着没事</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">YY</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">吧。</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="FONT-FAMILY: 'Arial','sans-serif'"> </span></strong></span><strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">票子</span></strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">：就是钱呗，大把大把的钞票。有啥别有病，没啥别没钱。有钱能使鬼推磨，而我认为有钱能使人变鬼！多少人每天在为这个东西消耗自己生命呀，现在拿命换钱，以后拿钱换命！有人说了，怕什么，我们都年轻，身体都好，都有两颗滚烫的肾。也是，只有赚更多的钱才能买房子，车子，娶妻结婚，争得面子。似乎钱的多少就是衡量幸福度的高低，可是居全球</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">GNH</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">调查，幸福度最高的国家是在人均</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">GDP</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">仅为</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">700</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">多美元的南亚小国不丹。人家穷，但快乐着！你为了挣更多的钱最后落个抑郁症心血管病啥的，我看到时你还觉得钱好不？</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">房子</span></strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">：这是所有外地漂流者心中的痛，没有自己的房子感觉就象没有家，没有娶妻生子的基本条件。可是，有家就要有房吗？有房就是有家吗？不知道什么时候开始人们的观念变得如此恶俗，结婚必须要有房子，男方要没有房子甚至会毁了一门亲事。据调查，欧洲国家买房子的平均年龄是</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">42</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">岁，而中国</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">20</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">多岁刚工作没几年的年轻人却纷纷想买房，不但勒紧裤腰带承受巨大的压力做房奴，还要榨干父母一辈子的积蓄交首付。美国人那么有钱，</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">60%</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">以上的人都是租房，我就纳了闷了，同样是地球人，观念的差距怎么就那么大捏？除了人傻，我们的房价也操蛋！一个劲的往上飙，涨得速度比你薪水快好几倍。上海房价最高</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">5</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万，东京最高才</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">3</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万，不过人家</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">GDP</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">是我们的</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">10</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">倍，你说我们这是搞什么搞！总之我是想清楚了，买房和租房，要么是给银行打工，交高利贷，要么给房东打工，凑合住，一个是租国家土地的使用权</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">70</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">年，一个是租个人房子的使用权时间自己说了算，一个是让积蓄全变成死钱，一个是让积蓄怀孕。您自己悠着，反正我不发笔横财不敢买房。</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">车子</span></strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">：有一次和网上一</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">MM</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">聊天，上来就问你开什么牌子车？您瞧，都不问你有没有车就直接问牌子，我告诉她：飞鸽，永久也开过，最近升级成捷安特了。和我想的一样，她从此永久潜水了。车子，要说对做大生意的日理万机一天要跑五六个地的还有点用，对老百姓来说，不就是为面子吗？坐公车地铁十几分钟就能到，您非要买个</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">2</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">手夏利一点一点蹭，除了浪费时间您还为破坏臭氧层浪费汽油占据停车位交通更拥堵做出了杰出贡献。从成本来算，一辆车</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">10</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万，用</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">10</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">年，一年的停车费保养汽油保险最少</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">2</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万，那就是</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">30</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万，您每天打的一年不过才</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">1</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万多。和房子类似，我们和美国人用价位差不多油钱差不多的车子跑的挺烧包，不过别忘了，人家平均工资是我们的</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">10</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">倍！欧洲人有钱吧，人家都提倡用公共交通骑自行车，马路上开的也都是两厢小排量的小汽车。中国人好面子，马路上一看全是能烤肉的大粗管子，北京人更好面子，自然北京就是私家车最多交通最拥堵的城市。等我真要哪天钱多得发愁花不出去时，买个车再雇几个人后面推，起码咱环保呀，不过估计那时环保燃料的车都满天飞了吧！（脑中幻觉请参照电影《第五元素》）总之，走自己的路，让老爷子打的去吧！</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">妻子</span></strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">：综上所述，有了以上</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">3</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">样东西，您娶妻的基本条件就有了，要是您长得还对得起大家那找个中等老婆应该是比较容易了，特漂亮的最好不要想，您手里的票还不是</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">VIP</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，就算您运气好撞上一大美女，那小心以后您的鞋垫都是绿的，对于普通人来说美女虽然养眼但是就和名贵瓷器一样搁哪都不放心。网上有一强帖，说的是在北京娶一个中等老婆的成本，算上房子，装修，置办结婚，竟然是</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">99.8</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万！按现在的房价算应该是最少</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">100</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">多万了，普通白领不吃不喝不生病要攒</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">15</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">年，就算贷款买房也要</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">10</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">年，那时我只能享受老来得子的人生乐趣了。说实话，现在的女孩越来越物质了，把自己长的漂亮，身材好，年轻，当作资本，如果女孩仅仅靠这些来换取物质丰厚的生活那和小姐有什么区别呢？算下来每次比小姐还要便宜呢。（网上已有强帖证明，不是本人亲自试验）关于女孩择偶标准流传一句话：</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">20</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">岁的女孩只要爱情，</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">25</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">岁的女孩一半爱情一半条件，</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">25</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">岁以上的女孩几乎就是要条件了。其实我很想问现在的女孩们一个比较</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">2</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的问题，你们是想和心爱的人（可能是穷小子）小燕衔泥过平凡日子呢还是想找个有车有房父母双亡的血钻王老五呢（可能长的不理想）？估计犹豫的女孩越来越多了。</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">孩子</span></strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">：这个是除了私生子外必须要有妻子了才能完成的事，也是你人生的最后一个重要任务！比较经典的一句话是：</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">15</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">秒的快感，</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">18</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">年的烦恼。养个孩子从出生到上大学据说要</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">400</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">万成本！从老婆怀孕起你就做好痛并快乐着生活的准备吧！其实这就是活该，孩子是你想要的，不是他自己要来的，你为了满足私欲得到一个孩子就要付出相应的代价，你想想，一个血肉模糊生活不能自理的生命被你带到世上，你不管谁管？！难怪有文化的人们越来越不热衷生孩子了。有了孩子的也不要担心，等你养到他上完大学，他也就该独立了，要是不幸也是个男孩，自然也就面临和你一样的五子登科了，你以为你能放松了？他要买房子你不得拿出一辈子的积蓄来？不过随着时代发展估计那时房子车子应该普及了，就如我们父辈当年结婚的三大件，手表，缝纫机，自行车，那时似乎没有也不能结婚似的，现在不都实现了？房子车子一个道理，所以不要急，还是攒钱准备给孩子买私家飞机吧！哭</span><span lang="EN-US" style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">~~&nbsp;<br />
<strong><span style="BACKGROUND: #ffff99; FONT-FAMILY: 'Arial','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span><strong><span style="FONT-SIZE: 9pt; BACKGROUND: #ffff99; COLOR: red; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">扯了这么多，其实都是我们这些大俗男人每天想的时刻困扰我们的东西，我们都是俗人，我们还不能马上超脱，我们可能还会面临老子，马子更多子的问题，我们只能在残酷的社会里学会让自己快乐。我们只想活着，幸福的活着。</span></strong><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <span lang="EN-US"><o:p></o:p></span></span></font></p>
<p class="MsoNormal" style="LINE-HEIGHT: 150%"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/150175#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Dec 2007 19:28:18 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/150175</link>
        <guid>http://yinhj.javaeye.com/blog/150175</guid>
      </item>
      <item>
        <title>今天在网上看到了Google的GPhone的消息，学习学习android先。</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/141443" style="color:red;">http://yinhj.javaeye.com/blog/141443</a>&nbsp;
          发表时间: 2007年11月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">先给大家提供一点资料。</div>
<div class="code_title">安装android for eclipse的过程。</div>
<div class="code_title">有时间chinese一下。</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Start&nbsp;Eclipse,&nbsp;then&nbsp;select&nbsp;Help&nbsp;&gt;&nbsp;Software&nbsp;Updates&nbsp;&gt;&nbsp;Find&nbsp;and&nbsp;Install....&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>In&nbsp;the&nbsp;dialog&nbsp;that&nbsp;appears,&nbsp;select&nbsp;Search&nbsp;</span><span class="keyword">for</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;features&nbsp;to&nbsp;install&nbsp;and&nbsp;press&nbsp;Next.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Press&nbsp;New&nbsp;Remote&nbsp;Site.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>In&nbsp;the&nbsp;resulting&nbsp;dialog&nbsp;box,&nbsp;enter&nbsp;a&nbsp;name&nbsp;</span><span class="keyword">for</span><span>&nbsp;the&nbsp;remote&nbsp;site&nbsp;(e.g.&nbsp;Android&nbsp;Plugin)&nbsp;and&nbsp;enter&nbsp;</span><span class="keyword">this</span><span>&nbsp;as&nbsp;its&nbsp;URL:&nbsp;https:</span><span class="comment">//dl-ssl.google.com/android/eclipse/.&nbsp;Press&nbsp;OK.&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>You&nbsp;should&nbsp;now&nbsp;see&nbsp;the&nbsp;</span><span class="keyword">new</span><span>&nbsp;site&nbsp;added&nbsp;to&nbsp;the&nbsp;search&nbsp;list&nbsp;(and&nbsp;checked).&nbsp;Press&nbsp;Finish.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>In&nbsp;the&nbsp;subsequent&nbsp;Search&nbsp;Results&nbsp;dialog&nbsp;box,&nbsp;select&nbsp;the&nbsp;checkbox&nbsp;</span><span class="keyword">for</span><span>&nbsp;Android&nbsp;Plugin&nbsp;&gt;&nbsp;Eclipse&nbsp;Integration&nbsp;&gt;&nbsp;Android&nbsp;Development&nbsp;Tools&nbsp;and&nbsp;press&nbsp;Next.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Read&nbsp;the&nbsp;license&nbsp;agreement&nbsp;and&nbsp;then&nbsp;select&nbsp;Accept&nbsp;terms&nbsp;of&nbsp;the&nbsp;license&nbsp;agreement,&nbsp;</span><span class="keyword">if</span><span>&nbsp;appropriate.&nbsp;Press&nbsp;Next.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Press&nbsp;Finish.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>The&nbsp;ADT&nbsp;plugin&nbsp;is&nbsp;not&nbsp;signed;&nbsp;you&nbsp;can&nbsp;accept&nbsp;the&nbsp;installation&nbsp;anyway&nbsp;by&nbsp;pressing&nbsp;Install&nbsp;All.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Restart&nbsp;Eclipse.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>After&nbsp;restart,&nbsp;update&nbsp;your&nbsp;Eclipse&nbsp;preferences&nbsp;to&nbsp;point&nbsp;to&nbsp;the&nbsp;SDK&nbsp;root&nbsp;directory&nbsp;($SDK_ROOT):&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="number">1</span><span>.&nbsp;Select&nbsp;Window&nbsp;&gt;&nbsp;Preferences...&nbsp;to&nbsp;open&nbsp;the&nbsp;Preferences&nbsp;panel.&nbsp;(Mac&nbsp;OS&nbsp;X:&nbsp;Eclipse&nbsp;&gt;&nbsp;Preferences)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="number">2</span><span>.&nbsp;Select&nbsp;Android&nbsp;from&nbsp;the&nbsp;left&nbsp;panel.&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="number">3</span><span>.&nbsp;For&nbsp;the&nbsp;SDK&nbsp;Location&nbsp;in&nbsp;the&nbsp;main&nbsp;panel,&nbsp;press&nbsp;Browse...&nbsp;and&nbsp;find&nbsp;the&nbsp;SDK&nbsp;root&nbsp;directory.&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="number">4</span><span>.&nbsp;Press&nbsp;Apply,&nbsp;then&nbsp;OK&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/141443#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 Nov 2007 23:40:53 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/141443</link>
        <guid>http://yinhj.javaeye.com/blog/141443</guid>
      </item>
      <item>
        <title>Linux上NFS共享</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/141220" style="color:red;">http://yinhj.javaeye.com/blog/141220</a>&nbsp;
          发表时间: 2007年11月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>NFS服务器上(<font color="#ff0000">192.168.0.203</font>)</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>#vi&nbsp;/etc/exports &nbsp;&nbsp;</span></span></li>
    <li class=""><span>在exports里增加 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/home/cqxs3/data　　</span><span class="number">192.168</span><span>.</span><span class="number">0.119</span><span>(rw)&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>启动NFS服务</p>
<div class="code_title">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>#/etc/rc.d/init.d/portmap&nbsp;start&nbsp;(在REDHAT中PORTMAP是默认启动的）&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>#/etc/rc.d/init.d/nfs&nbsp;start</span></li>
    <span>
    <li class="alt"><span><span>退出后，使挂接立既生效 &nbsp;&nbsp;</span></span></li>
    <li class=""><span>#exportfs&nbsp;-rv&nbsp;</span>&nbsp;&nbsp;</li>
    </span></ol>
    </div>
    </div>
    <div class="code_title"></div>
    <p>共享客户机(192.168.0.119)</p>
    <div class="dp-highlighter">
    <div class="bar"></div>
    <ol class="dp-j">
        <li class="alt"><span><span>#mount&nbsp;-t&nbsp;nfs&nbsp;</span><span class="number">192.168</span><span>.</span><span class="number">0.203</span><span>:/home/cqxs3/data&nbsp;/home/cqxs3/data&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <p>也可以配置成客户机启动即生效</p>
    <div class="dp-highlighter">
    <div class="bar"></div>
    <ol class="dp-j">
        <li class="alt"><span><span>#vi&nbsp;/etc/fstab &nbsp;&nbsp;</span></span></li>
        <li class=""><span>加入以下内容 &nbsp;&nbsp;</span></li>
        <li class="alt"><span></span><span class="number">192.168</span><span>.</span><span class="number">0.203</span><span>:/home/cqxs3/data&nbsp;&nbsp;/home/cqxs3/data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">0</span><span>&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;</span></li>
    </ol>
    </div>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/141220#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Nov 2007 15:51:35 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/141220</link>
        <guid>http://yinhj.javaeye.com/blog/141220</guid>
      </item>
      <item>
        <title>vsFTPd 服务器的安装和配置</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/140969" style="color:red;">http://yinhj.javaeye.com/blog/140969</a>&nbsp;
          发表时间: 2007年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1、RPM安装方式（个人觉得最简单）</font></p>
<p><font face="Arial"><br />
如果您是RPM的系统，可以找到vsftpd-xxxx.rpm 的包来通过rpm命令来安装；</font></p>
<p><font face="Arial">找到vsftpd-xxxx.rpm并放入/usr/local/src下</font><font face="Arial"></font><font face="Arial"> </font><font face="Arial"></font></p>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>#&nbsp;rpm&nbsp;-ivh&nbsp;vsftpd*.rpm&nbsp;</span></span> </li>
</ol>
</div>
<p>在配置文件的最后一行加入下面一行；</p>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span><span>#&nbsp;vi&nbsp;/etc/vsftpd.conf&nbsp;</span></span></span> </li>
    <li class="alt"><span><span># listen=yes&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><br />
<span><span>启动、<span>停止、和<span>重启</span></span></span></span></p>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>启动 &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>#&nbsp;/etc/init.d/vsftpd&nbsp;start &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>停止 &nbsp;&nbsp;</span> </li>
    <li class=""><span>#&nbsp;/etc/init.d/vsftpd&nbsp;stop &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>重启 &nbsp;&nbsp;</span> </li>
    <li class=""><span>#&nbsp;/etc/init.d/vsftpd&nbsp;restart &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>2、下载源码包来安装</p>
<p><font face="Arial">比如我们下载的是 vsftpd-2.0.3.tar.gz ；</font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span>#&nbsp;tar&nbsp;zxvf&nbsp;vsftpd-</span><span class="number">2.0</span><span>.</span><span class="number">3</span><span>.tar.gz &nbsp;&nbsp;</span> </li>
    <li class=""><span>#&nbsp;cd&nbsp;vsftpd-</span><span class="number">2.0</span><span>.</span><span class="number">3</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>#&nbsp;make&nbsp;;make&nbsp;install &nbsp;&nbsp;</span> </li>
    <li class=""><span>#&nbsp;cp&nbsp;vsftpd.conf&nbsp;/etc&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">然后修改/etc/vsftpd.conf ，在配置文件的最后一行加入下面一行；</font> </p>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>#&nbsp;vi&nbsp;/etc/vsftpd.conf&nbsp;&nbsp;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>#&nbsp;listen=yes&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/140969#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Nov 2007 17:16:14 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/140969</link>
        <guid>http://yinhj.javaeye.com/blog/140969</guid>
      </item>
      <item>
        <title>多线程Java Socket编程示例</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/139702" style="color:red;">http://yinhj.javaeye.com/blog/139702</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title"></div>
<p>这篇做为学习孙卫琴&lt;&gt;的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.<br />
<br />
1.服务端</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;sterning; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedReader; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.InputStream; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.InputStreamReader; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.OutputStream; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.PrintWriter; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.net.*; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.util.concurrent.*; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MultiThreadServer&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;port=</span><span class="number">8821</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;ServerSocket&nbsp;serverSocket; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;ExecutorService&nbsp;executorService;</span><span class="comment">//线程池 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;POOL_SIZE=</span><span class="number">10</span><span>;</span><span class="comment">//单个CPU线程池大小 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MultiThreadServer()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serverSocket=</span><span class="keyword">new</span><span>&nbsp;ServerSocket(port); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Runtime的availableProcessor()方法返回当前系统的CPU数目. </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;服务器启动&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;service(){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(</span><span class="keyword">true</span><span>){ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket=</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket=serverSocket.accept(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executorService.execute(</span><span class="keyword">new</span><span>&nbsp;Handler(socket)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;MultiThreadServer().service(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;Handler&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Runnable{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Socket&nbsp;socket; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Handler(Socket&nbsp;socket){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.socket=socket; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;PrintWriter&nbsp;getWriter(Socket&nbsp;socket)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;socketOut=socket.getOutputStream(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;PrintWriter(socketOut,</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;BufferedReader&nbsp;getReader(Socket&nbsp;socket)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;socketIn=socket.getInputStream(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(socketIn)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;echo(String&nbsp;msg){ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;echo:&quot;</span><span>+msg; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run(){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;New&nbsp;connection&nbsp;accepted&nbsp;&quot;</span><span>+socket.getInetAddress()+</span><span class="string">&quot;:&quot;</span><span>+socket.getPort()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br=getReader(socket); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;pw=getWriter(socket); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg=</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>((msg=br.readLine())!=</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pw.println(echo(msg)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(msg.equals(</span><span class="string">&quot;bye&quot;</span><span>)) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">finally</span><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(socket!=</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>2.客户端</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;sterning; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedReader; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.InputStreamReader; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.OutputStream; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.net.Socket; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.util.concurrent.ExecutorService; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.util.concurrent.Executors; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MultiThreadClient&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;numTasks&nbsp;=&nbsp;</span><span class="number">10</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecutorService&nbsp;exec&nbsp;=&nbsp;Executors.newCachedThreadPool(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;numTasks;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec.execute(createTask(i)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;定义一个简单的任务 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Runnable&nbsp;createTask(</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;taskID)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Runnable()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Socket&nbsp;socket&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;port=</span><span class="number">8821</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Task&nbsp;&quot;</span><span>&nbsp;+&nbsp;taskID&nbsp;+&nbsp;</span><span class="string">&quot;:start&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Socket(</span><span class="string">&quot;localhost&quot;</span><span>,&nbsp;port); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;发送关闭命令 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;socketOut&nbsp;=&nbsp;socket.getOutputStream(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socketOut.write(</span><span class="string">&quot;shutdown\r\n&quot;</span><span>.getBytes()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;接收服务器的反馈 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader( &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(socket.getInputStream())); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;((msg&nbsp;=&nbsp;br.readLine())&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子---<a href="http://www.blogjava.net/sterning/archive/2007/10/13/152508.html" class="titlelink" id="Editor_Results_rprSelectionList_ctl05_LinkTitle">Java基于Socket文件传输示例</a>,就可以实现多线程文件的传输了 </p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/139702#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Nov 2007 22:04:51 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/139702</link>
        <guid>http://yinhj.javaeye.com/blog/139702</guid>
      </item>
      <item>
        <title>Lucene 基础指南</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/95502" style="color:red;">http://yinhj.javaeye.com/blog/95502</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大，但api其实很简单的，它最主要就是做两件事:建立索引和进行搜索。<br />
<br />
<strong>1. 建立索引时最重要的几个术语</strong><br />
Document：一个要进行索引的单元，相当于数据库的一行纪录，任何想要被索引的数据，都必须转化为Document对象存放。 <br />
Field：Document中的一个字段，相当于数据库中的Column ，Field是lucene比较多概念一个术语，详细见后。 <br />
IndexWriter：负责将Document写入索引文件。通常情况下,IndexWriter的构造函数包括了以下3个参数:索引存放的路径,分析器和是否重新创建索引。特别注意的一点，当IndexWriter执行完addDocument方法后，一定要记得调用自身的close方法来关闭它。只有在调用了close方法后，索引器才会将存放在内在中的所有内容写入磁盘并关闭输出流。 <br />
Analyzer:分析器，主要用于文本分词。常用的有StandardAnalyzer分析器，StopAnalyzer分析器，WhitespaceAnalyzer分析器等。 <br />
Directory:索引存放的位置。lucene提供了两种索引存放的位置，一种是磁盘，一种是内存。一般情况将索引放在磁盘上；相应地lucene提供了FSDirectory和RAMDirectory两个类。 <br />
段：Segment,是Lucene索引文件的最基本的一个单位。Lucene说到底就是不断加入新的Segment，然后按一定的规则算法合并不同的Segment以合成新的Segment。 <br />
lucene建立索引的过程就是将待索引的对象转化为Lucene的Document对象，使用IndexWriter将其写入lucene 自定义格式的索引文件中。<br />
<br />
待索引的对象可以来自文件、数据库等任意途径，用户自行编码遍历目录读取文件或者查询数据库表取得ResultSet，Lucene的API只负责和字符串打交道。<br />
<br />
<strong>1.1 Field 的解释</strong><br />
从源代码中，可以看出Field 构造函数如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Field(String&nbsp;name,&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;value,&nbsp;Field.Store&nbsp;store) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>Field(String&nbsp;name,&nbsp;Reader&nbsp;reader) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>Field(String&nbsp;name,&nbsp;Reader&nbsp;reader,&nbsp;Field.TermVector&nbsp;termVector) &nbsp;&nbsp;</span> </li>
    <li class=""><span>Field(String&nbsp;name,&nbsp;String&nbsp;value,&nbsp;Field.Store&nbsp;store,&nbsp;Field.Index&nbsp;index) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>Field(String&nbsp;name,&nbsp;String&nbsp;value,&nbsp;Field.Store&nbsp;store,&nbsp;Field.Index&nbsp;index,&nbsp;Field.TermVector&nbsp;termVector)在Field当中有三个内部类：Field.Index,Field.Store,Field.termVector。 &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>其中<br />
<br />
Field.Index有四个属性，分别是：<br />
Field.Index.TOKENIZED：分词索引<br />
Field.Index.UN_TOKENIZED：分词进行索引，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。<br />
Field.Index：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。<br />
Field.Index.NO_NORMS：； <br />
Field.Store也有三个属性，分别是：<br />
Field.Store.YES：索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。<br />
Field.Store.NO：原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。<br />
Field.Store.COMPRESS 压缩存储； <br />
termVector是Lucene 1.4.3新增的它提供一种向量机制来进行模糊查询,很少用。 <br />
上面所说的Field属性与lucene1.4.3版本的有比较大的不同，在旧版的1.4.3里lucene是通过Field.Keyword(...),FieldUnIndexed(...),FieldUnstored(...)和Field.Text(...)来设置不同字段的类型以达到不同的用途，而当前版本由Field.Index和Field.Store两个字段的不同组合来达到上述效果。<br />
还有一点说明,其中的两个构造函数其默认的值为Field.Store.NO和Field.Index.TOKENIZED。：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>Field(String&nbsp;name,&nbsp;Reader&nbsp;reader) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>Field(String&nbsp;name,&nbsp;Reader&nbsp;reader,&nbsp;Field.TermVector&nbsp;termVector)&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>IndexWriter类提供了一个setMaxFieldLength的方法来对Field的长度进行限制，看一下源代码就知道其默认值为10000；我们可以在使用时重新设置此参数。如果使用默认值，那么Lucene就仅仅对文档的前面的10000个term进行索引，超过这一个数的文档就不会被建立索引。 <br />
<br />
<strong>1.2 索引的合并、删除、优化</strong><br />
IndexWriter中的addIndexes方法将索引进行合并;当在不同的地方创建了索引后，如果需要将索引合并，这时候使用addIndexes方法就显得很有意义。 <br />
可以通过IndexReader类从索引中进行文档的删除。IndexReader是很特别的一个类，看源代码就知道它主要是通过自身的静态方法来完成构造的。示例： [/code]IndexReader reader = IndexReader.open(&quot;C:\\springside&quot;);<br />
reader.deleteDocument(X); //这里的X是一个int的常数；不推荐这一种删除方法<br />
reader.deleteDocument(new Term(&quot;name&quot;,&quot;springside&quot;));//这是另一种删除索引的方法，按字段来删除，推荐使用这一种做法<br />
reader.close();[/code]优化索引:可以使用IndexWriter类的optimize方法来进行优先，它会将多个Segment进行合并，组成一个新的Segment,可以加快建立索引后搜索的速度。另外需要注意的一点，optimize方法会降低建立索引的速度，而且要求的磁盘空间会增加。 <br />
<br />
<strong>2. 进行搜索时最常用的几个术语</strong><br />
IndexSearcher:是lucene中最基本的检索工具，所有的检索都会用到IndexSearcher工具。初始化IndexSearcher需要设置索引存放的路径，让查询器能定位索引而进行搜索。 <br />
Query:查询，lucene中支持模糊查询，语义查询，短语查询，组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。 <br />
QueryParser: 是一个解析用户输入的工具，可以通过扫描用户输入的字符串，生成Query对象。 <br />
Hits:在搜索完成之后，需要把搜索结果返回并显示给用户，只有这样才算是完成搜索的目的。在lucene中，搜索的结果的集合是用Hits类的实例来表示的。Hits对象中主要方法有： </p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>length():&nbsp;返回搜索结果的总数,下面简单的用法中有用到Hit的这一个方法 &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>doc(</span><span class="keyword">int</span><span>&nbsp;n):&nbsp;返回第n个文档 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>iterator():&nbsp;返回一个迭代器&nbsp;&nbsp;</span> </li>
</ol>
</div>
这里再提一下Hits，这也是Lucene比较精彩的地方，熟悉hibernate的朋友都知道hibernate有一个延迟加载的属性，同样,Lucene也有。Hits对象也是采用延迟加载的方式返回结果的，当要访问某个文档时，Hits对象就在内部对Lucene的索引又进行一次检索，最后才将结果返回到页面显示。<br />
<br />
<strong>3. 一个简单的实例：</strong><br />
首先把lucene的包放在classpath路径中去，写下面一个简单的类：
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;FSDirectoryTest&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;</span><span class="comment">//建立索引的路径 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;path&nbsp;=&nbsp;</span><span class="string">&quot;c:\\index2&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;Document&nbsp;doc1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Document(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;doc1.add(&nbsp;</span><span class="keyword">new</span><span>&nbsp;Field(</span><span class="string">&quot;name&quot;</span><span>,&nbsp;</span><span class="string">&quot;lighter&nbsp;springside&nbsp;com&quot;</span><span>,Field.Store.YES,Field.Index.TOKENIZED)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;Document&nbsp;doc2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Document(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;doc2.add(</span><span class="keyword">new</span><span>&nbsp;Field(</span><span class="string">&quot;name&quot;</span><span>,&nbsp;</span><span class="string">&quot;lighter&nbsp;blog&quot;</span><span>,Field.Store.YES,Field.Index.TOKENIZED)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexWriter(FSDirectory.getDirectory(path,&nbsp;</span><span class="keyword">true</span><span>),&nbsp;</span><span class="keyword">new</span><span>&nbsp;StandardAnalyzer(),&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;writer.addDocument(doc1); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;writer.addDocument(doc2); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;writer.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexSearcher(path); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;Query&nbsp;query&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;QueryParser&nbsp;qp&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;QueryParser(</span><span class="string">&quot;name&quot;</span><span>,</span><span class="keyword">new</span><span>&nbsp;StandardAnalyzer()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;query&nbsp;=&nbsp;qp.parse(</span><span class="string">&quot;lighter&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;hits&nbsp;=&nbsp;searcher.search(query); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;System.out.println(</span><span class="string">&quot;查找\&quot;lighter\&quot;&nbsp;共&quot;</span><span>&nbsp;+&nbsp;hits.length()&nbsp;+&nbsp;</span><span class="string">&quot;个结果&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;query&nbsp;=&nbsp;qp.parse(</span><span class="string">&quot;springside&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;hits&nbsp;=&nbsp;searcher.search(query); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;System.out.println(</span><span class="string">&quot;查找\&quot;springside\&quot;&nbsp;共&quot;</span><span>&nbsp;+&nbsp;hits.length()&nbsp;+&nbsp;</span><span class="string">&quot;个结果&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>执行的结果： &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>查找</span><span class="string">&quot;lighter&quot;</span><span>&nbsp;共</span><span class="number">2</span><span>个结果 &nbsp;&nbsp;</span> </li>
    <li class=""><span>查找</span><span class="string">&quot;springside&quot;</span><span>&nbsp;共</span><span class="number">1</span><span>个结果&nbsp;&nbsp;</span> </li>
</ol>
</div>
<strong>4. 一个复杂一点的实例</strong><br />
在windows系统下的的C盘，建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件，随便起名啦，就叫&quot;1.txt&quot;,&quot;2.txt&quot;和&quot;3.txt&quot;啦<br />
其中1.txt的内容如下：
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>springside社区 &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>更大进步，吸引更多用户,更多贡献&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="number">2007</span><span>年&nbsp;&nbsp;</span> </li>
</ol>
</div>
而&quot;2.txt&quot;和&quot;3.txt&quot;的内容也可以随便写几写，这里懒写，就复制一个和1.txt文件的内容一样吧<br />
<br />
下载lucene包，放在classpath路径中，然后建立索引:
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">/** </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;author&nbsp;lighter&nbsp;date&nbsp;2006-8-7 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;LuceneExample&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;fileDir&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">&quot;c:\\s&quot;</span><span>);&nbsp;</span><span class="comment">//&nbsp;指明要索引文件夹的位置,这里是C盘的S文件夹下&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;indexDir&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">&quot;c:\\index&quot;</span><span>);&nbsp;</span><span class="comment">//&nbsp;这里放索引文件的位置 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;textFiles&nbsp;=&nbsp;fileDir.listFiles(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Analyzer&nbsp;luceneAnalyzer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StandardAnalyzer(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;indexWriter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexWriter(indexDir,luceneAnalyzer,</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;indexFile(luceneAnalyzer,indexWriter,&nbsp;textFiles);&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;indexWriter.optimize();</span><span class="comment">//optimize()方法是对索引进行优化 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;indexWriter.close();&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;indexFile(Analyzer&nbsp;luceneAnalyzer,IndexWriter&nbsp;indexWriter,File[]&nbsp;textFiles)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//增加document到索引去 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;textFiles.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(textFiles[i].isFile()&nbsp;&amp;&amp;&nbsp;textFiles[i].getName().endsWith(</span><span class="string">&quot;.txt&quot;</span><span>))&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;temp&nbsp;=&nbsp;FileReaderAll(textFiles[i].getCanonicalPath(),</span><span class="string">&quot;GBK&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;document&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Document(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;FieldBody&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Field(</span><span class="string">&quot;body&quot;</span><span>,&nbsp;temp,&nbsp;Field.Store.YES,Field.Index.TOKENIZED); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.add(FieldBody); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexWriter.addDocument(document); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;FileReaderAll(String&nbsp;FileName,&nbsp;String&nbsp;charset)</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileInputStream(FileName),&nbsp;charset)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;temp&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;((line&nbsp;=&nbsp;reader.readLine())&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;+=&nbsp;line; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;temp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>执行查询：&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestQuery&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ParseException&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;String&nbsp;queryString&nbsp;=&nbsp;</span><span class="string">&quot;社区&quot;</span><span>;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;Query&nbsp;query&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexSearcher(</span><span class="string">&quot;c:\\index&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;Analyzer&nbsp;analyzer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StandardAnalyzer();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;QueryParser&nbsp;qp&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;QueryParser(</span><span class="string">&quot;body&quot;</span><span>,&nbsp;analyzer);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;query&nbsp;=&nbsp;qp.parse(queryString);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(ParseException&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(searcher&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;hits&nbsp;=&nbsp;searcher.search(query);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(hits.length()&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;System.out.println(</span><span class="string">&quot;找到:&quot;</span><span>&nbsp;+&nbsp;hits.length()&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;个结果!&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>执行结果：&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>找到:</span><span class="number">3</span><span>&nbsp;个结果! &nbsp;&nbsp;</span> </li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/95502#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Nov 2007 21:51:00 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/95502</link>
        <guid>http://yinhj.javaeye.com/blog/95502</guid>
      </item>
      <item>
        <title>保养腰椎，不妨做做腰肌操。</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/104349" style="color:red;">http://yinhj.javaeye.com/blog/104349</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">　　有这样一句话&ldquo;力发于腰而根于足&rdquo;，也就是说上半身几乎所有用力的动作均需要腰肌的辅助。此外，腰椎的间隙及椎间盘的高度很大程度是依靠腰肌的支撑才能得以维持。因此腰肌的任务重大，一旦功能减弱就会为很多严重疾病埋下隐患。长期伏案工作、开车或睡软床，久之腰肌越来越弱，一点点受伤，然后渗出变硬，再损伤再变硬。十几年后，腰肌变得像石头一般，失去了保护椎体的力量，椎间盘就开始膨出、突出甚至脱出，然后卡压脊神经造成持久的疼痛，腰椎体也可能出现滑脱。</font></p>
<p><font face="Arial">　　通过按摩、理疗、牵引和针灸等治疗，能够在很大程度上改善各种腰部症状。但是，如果腰肌得不到很好的锻炼，即使一次的手法治疗能完全缓解的腰痛症状，却不能保证不再出现症状。经过研究，中医专家设计出了一套自我锻炼腰肌的方法，无论有无腰部疾患，人们均可以按此方法进行锻炼，有效减少腰部疾病的发生机会。</font></p>
<p><font face="Arial">　　<strong>9招式防腰椎退行性变</strong></font></p>
<p><font face="Arial">　　下列锻炼方法可广泛用于腰椎退行性疾病，包括腰椎间盘突出、腰肌劳损等，但绝不能用于假性和真性腰椎滑脱。因此，患者应先去医院就诊后再考虑是否应用下列练习方法。</font></p>
<p><font face="Arial">　　(1)后仰：自然站立，两脚叉开与肩同宽，双手叉腰，深呼吸一次以后，腰部向前挺，同时头、胸部尽量向后仰，第一次做，不要求后仰幅度太大，以免腰部肌肉力量不足造成身体失去重心而摔倒，以眼睛能看到头顶正上方为佳，然后慢慢回到原位并休息30秒，再如前操作，共20次。练习一段时间后，腰部肌肉力量渐渐增强了，就可以加大后仰幅度。这个动作主要是锻炼腰背部的肌肉力量。力量越大，给予腰椎的保护性力量也就越大，同时腰椎间的间隙也能慢慢地良性增加，促进膨出或突出的椎间盘回纳。</font></p>
<p><font face="Arial">　　(2)转身：站立位，双手叉腰，上身缓缓地左右旋转20次左右。转身时要以腰部主动用力为主，肩关节不要向前甩动用力，以免造成肩背牵拉腰肌受伤。旋转的目的，一方面是要锻炼腰背肌，另一方面是要松解椎管内的粘连和调整腰椎小关节，因此旋转时一定要缓慢，旋转角度不要超过45度，在肌肉和关节正常活动范围和能承受的强度内进行练习，这样才能在保健治疗的同时避免损伤。</font></p>
<p><font face="Arial">　　(3)四点支撑：所谓四点支撑，就是用两个胳膊肘和两只脚，共四个部位作为支点支在床面上，腰部用力向上抬臀部。抬起来坚持5秒后慢慢放下，然后再做，每次练习共做10个即可。要注意的是，千万不要在柔软的床上练习，一定要在硬板床上，以防止扭伤关节。这个动作练习强度虽然比较小但是效果不错，主要是锻炼腰背肌。</font></p>
<p><font face="Arial">　　(4)燕飞：这个动作很像小燕子在空中飞行，具体操作是：脸朝下趴在木板床上，双手放于身体的两侧，同时下肢伸直，头、胸和四肢同时向上抬，双手也同时向上背，双脚尽量绷直，腹部着床，停一会再慢慢放下。这样反复操作，5个为一组，争取每天做10组。如果力量不够，还可以脸朝下趴在一张单人床上，两手垂下来抱住床头，头部放松，耷拉在床上部用力，只将腿部尽量向上伸，脚尖尽量绷直。也能达到类似效果，只是强度小些。&ldquo;燕飞&rdquo;相对&ldquo;后仰&rdquo;和&ldquo;四点支撑&rdquo;，是一种比较费力的练习方法，但锻炼的作用更强。即使没有腰部疾患，如果常常练习同样可以减少扭腰的几率。</font></p>
<p><font face="Arial">　　(5)弯腰：这个动作就是&ldquo;够脚尖&rdquo;，具体是站立位，弯腰，双上肢自然下垂，双手尽量摸脚尖，或双手交叉，手心向下，摸地，整个过程中膝关节尽量保持绷直不打弯儿。反复进行20次。这个动作的目的是拉伸椎管内外的脊神经和神经根，解除椎管内突出物与神经组织的粘连，以缓解下肢放射疼痛及感觉异常。一般弯腰练习都是在腰部症状得到明显改善后再开始。如果腰痛比较剧烈，千万不要勉强练习，否则会&ldquo;火上浇油&rdquo;。</font></p>
<p><font face="Arial">　　(6)抬下肢：平躺在床上，两条腿伸直，先抬一侧腿，直着抬起来不打弯儿，在能抬高的最大高度情况下努力抬一点再放下，然后再抬另一条腿，操作同前，这样反复进行，各抬20次。这个练习动作和弯腰练习的目的是一样的，只是一个站着做，一个躺着做，都是拉伸椎管内外的脊神经和神经根，解除神经组织卡压或粘连。</font></p>
<p><font face="Arial">　　(7)侧压腿：很多腰痛的患者，都伴有下肢的症状，轻则麻木，重则疼痛，过电样感觉，这多是坐骨神经受刺激的症状。侧压腿这个动作可以有效缓解坐骨神经卡压和刺激症状。具体操作是：双腿下蹲，两下肢交替向外侧伸直，身体弹动2～4次。继压健腿，共交替4次。注意练习时不要一下子用力过猛，否则容易拉伤梨状肌。</font></p>
<p><font face="Arial">　　(8)牵吊：双手抓住单杠，全身放松，用自身的体重对腰椎进行牵引，每天一次，每次坚持5分钟。这个动作对腰椎有一定好处的。举一个例子，我们在两片面包之间抹些果酱，叠好放在盘子里，果酱会从面包间隙中渗出；此时稍微将两片面包拉开一点点，渗出的果酱就会被吸回去。&ldquo;牵吊&rdquo;这个动作，就是这个道理。悬吊躯体时腰椎之间几乎不承受压力，反而变成反向的牵拉力，这样可以促进病变椎间盘的回纳和解除对神经根的压迫。对于既往患有腰椎间盘突出的患者，在慢性缓解期完全可以放心练习。</font></p>
<p><font face="Arial">　　(9)踢毽子：站立时，用感觉不适的腿踢毽子，每次踢20～40个，如果没有毽子，可空做动作。这个练习的意义同侧压腿。</font></p>
<p><font face="Arial"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>3方法防腰椎假性滑脱</strong> </font></p>
<p>　　腰椎假性滑脱就是腰椎椎体向前滑动，这种滑动是由于软组织损伤引起，而非骨折。如果是骨折引起，那就是真性滑脱了，这种疾病一旦确诊，推拿和自我锻炼是最理想的治疗方法。但是请注意，下列练习方法只适用于腰椎假性滑脱，绝不可用于其他腰椎疾病，例如单纯椎间盘突出。</p>
<p>　　(1)抬胸：平躺位，双腿伸直，双手放于身体两侧，头、胸部慢慢抬起，双手也随之抬起，抬到大约40度左右，稍停一会，再慢慢放下，反复练习10次。</p>
<p>　　(2)两头起：平躺体位，是上两个动作的结合动作，双手放于身体两侧，头胸部、双手和两下肢一起抬起，用腰部着床，反复练习10次。</p>
<p>　　(3)滚床：平躺体位，双下肢屈曲，大腿尽量贴近胸腹部，双手抱住膝部，腰背部着床，在床上向前后微微滚动10次。</p>
<p><strong>　　腰部保养5注意</strong></p>
<p>　　经常腰疼的患者，很多人不知道如何对腰部进行日常保养。中医专家对此提出5点建议：</p>
<p>　　1．一旦感到腰痛，请及时就诊，通过医生的检查，找到腰疼的病因所在，并且配合治疗。</p>
<p>　　2．当腰疼症状有所改善后，可以考虑功能锻炼。加强腰背肌的力量，注意不要在腰痛时锻炼，锻炼要循序渐进，不可急于求成，在身体情况允许的条件下，每次稍微&ldquo;欠着点儿&rdquo;，少做一两下，是一种好方法。</p>
<p>　　3．搬重物时，务必采取蹲下身体，双手持物然后保持上身直立，下肢蹬地起身的方法，千万不要弯腰起身。此外，搬起重物后，切不可原地扭转上半身。</p>
<p>　　4．如果诊断为腰部病变，不要长期佩戴护腰，以免腰部肌肉更加无力；平时要睡硬板床。</p>
<p>　　5．不要养成戴护腰的习惯，急性扭伤腰部及急性腰椎间盘突出，腰部无力可以用护腰，但使用不要超过一个月。长期佩戴护腰会减少腰部肌肉的使用度，造成腰肌废用性萎缩，一旦不用护腰就很容易扭伤腰部。</p>
          <br/>
          <span style="color:red;">
            <a href="http://yinhj.javaeye.com/blog/104349#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Nov 2007 21:51:00 +0800</pubDate>
        <link>http://yinhj.javaeye.com/blog/104349</link>
        <guid>http://yinhj.javaeye.com/blog/104349</guid>
      </item>
      <item>
        <title>一篇不错的介绍Java Socket编程的文章</title>
        <author>yinhj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yinhj.javaeye.com">yinhj</a>&nbsp;
          链接：<a href="http://yinhj.javaeye.com/blog/139696" style="color:red;">http://yinhj.javaeye.com/blog/139696</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><a href="http://java.ccidnet.com/art/297/20051223/399191_1.html">http://java.ccidnet.com/art/297/20051223/399191_1.html</a></font></p>
<p>&nbsp;</p>
<p><span class="a14c" id="zoom"><span class="a14c" id="zoom">&nbsp; </span></span></p>
<p style="TEXT-INDENT: 2em">事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言，去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的Api来完成这些工作，Socket就是其中之一。 </p>
<p style="TEXT-INDENT: 2em">对于Java而言。这些Api存在与Java.net这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯，然后其中一个必须提供一个固定的位置，而另一个则只需要知道这个固定的位置，并去建立两者之间的联系。然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器，而建立联系的通常叫做客户端。基于这个简单的模型，就可以进入网络编程。 </p>
<p style="TEXT-INDENT: 2em">Java对这个模型的支持有很多种Api。而这里我只想介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程