从网上找了2个例子,运行好用,地址忘了,罪过~
http://www.cnblogs.com/liunx/archive/2009/09/10/1564353.html
基于Apache MINA 2.0的程序,需要JDK 5.0以上版本,还需要以下软件:
(1)MINA 2.x Core
下载地址:http://mina.apache.org/downloads.html
(2)SLF4J 1.3.0 or greater
下载地址:http://www.slf4j.org/download.html
这里需要用到两个 SLF4J 的jar包:slf4j-api.jar 和 slf4j-jdk14.jar。
打开telnet 10010
输入算数表达式,可以得到计算结果;运行服务端和客户端,在客户端得到执行结果。
遗留问题:客户端的这几行代码是什么意思?
cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connector.dispose();
CalculatorServer.java
public class CalculatorServer { private static final int PORT = 10010; private static final Logger LOGGER = LoggerFactory .getLogger(CalculatorServer.class); public static void main(String[] args) throws IOException { IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8")))); acceptor.setHandler(new CalculatorHandler()); acceptor.bind(new InetSocketAddress(PORT)); LOGGER.info("计算器服务已启动,端口是" + PORT); } }
CalculatorHandler.java
public class CalculatorHandler extends IoHandlerAdapter { private static final Logger LOGGER = LoggerFactory .getLogger(CalculatorHandler.class); private ScriptEngine jsEngine = null; public CalculatorHandler() { ScriptEngineManager sfm = new ScriptEngineManager(); jsEngine = sfm.getEngineByName("JavaScript"); if (jsEngine == null) { throw new RuntimeException("找不到 JavaScript 引擎。"); } } public void exceptionCaught(IoSession session, Throwable cause) throws Exception { LOGGER.warn(cause.getMessage(), cause); } public void messageReceived(IoSession session, Object message) throws Exception { String expression = message.toString(); if ("quit".equalsIgnoreCase(expression.trim())) { session.close(true); return; } try { Object result = jsEngine.eval(expression); session.write(result.toString()); } catch (ScriptException e) { LOGGER.warn(e.getMessage(), e); session.write("Wrong expression, try again."); } } }
客户端
CalculatorClient.java
public class CalculatorClient { public static void main(String[] args) { IoConnector connector = new NioSocketConnector(); // 创建接受数据的过滤器 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); // 设定这个过滤器将一行一行(/r/n)的读取数据 chain.addLast("myChin", new ProtocolCodecFilter( new TextLineCodecFactory())); // 服务器的消息处理器:一个SamplMinaServerHander对象 connector.setHandler(new SamplMinaClientHander()); // set connect timeout connector.setConnectTimeoutMillis(100000); // 连接到服务器: ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 10010)); // Wait for the connection attempt to be finished. cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connector.dispose(); } }
SamplMinaClientHander.java
public class SamplMinaClientHander extends IoHandlerAdapter { @Override public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception { // TODO Auto-generated method stub } /** * 当客户端接受到消息时 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { // 我们已设定了服务器的消息规则是一行一行读取,这里就可以转为String: String s = (String) message; // Writer the received data back to remote peer System.out.println("服务器发来的收到消息: " + s); // 测试将消息回送给客户端 // session.write(s); } @Override public void messageSent(IoSession arg0, Object arg1) throws Exception { // TODO Auto-generated method stub } /** * 当一个客户端被关闭时 */ @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("one client Disconnect"); } @Override public void sessionCreated(IoSession arg0) throws Exception { // TODO Auto-generated method stub arg0.write("4*3"); } @Override public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception { // TODO Auto-generated method stub } /** * 当一个客户端连接进入时 */ @Override public void sessionOpened(IoSession session) throws Exception { // System.out.println("incomming client:" + session.getRemoteAddress()); // session.write("我来啦"); } }