1.首先请看服务端代码:
package org.apache.mina.example.reverser;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
* (<b>Entry point</b>) Reverser server which reverses all text lines from
* clients.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class Main {
private static final int PORT = 8080;
public static void main(String[] args) throws Exception {
NioSocketAcceptor acceptor = new NioSocketAcceptor();
// Prepare the configuration
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
// Bind
acceptor.setHandler(new ReverseProtocolHandler());
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listening on port " + PORT);
}
}
2.在看服务器端消息处理器
package org.apache.mina.example.reverser;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* {@link IoHandler} implementation of reverser server protocol.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class ReverseProtocolHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// Close connection when unexpected exception is caught.
session.close(true);
}
@Override
public void messageReceived(IoSession session, Object message) {
// Reverse reveiced string
String str = message.toString();
System.err.println("收到客户端发来的消息::"+str);
StringBuilder buf = new StringBuilder(str.length());
for (int i = str.length() - 1; i >= 0; i--) {
buf.append(str.charAt(i));
}
// and write it back.
session.write(buf.toString());
}
}
3.接着是自己模仿写的客户端代码:
package org.apache.mina.example.reverser;
import java.net.InetSocketAddress;
import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MyClient
{
private static final String HOSTNAME = "localhost";
private static final int PORT = 8080;
private static final long CONNECT_TIMEOUT = 30*1000L; // 30 seconds
public static void main(String[] args) throws Exception
{
// 创建 TCP/IP connector.
NioSocketConnector connector = new NioSocketConnector();
//设置日志过滤器
connector.getFilterChain().addLast("logger", new LoggingFilter());
//获得过滤器,设置读取数据的方式一行一行的读.
connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory()));
connector.setHandler(new ReverseClientHandler());
//set connect timeout
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
IoSession session;
for (;;) {
try {
//连接到服务器
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT));
future.awaitUninterruptibly();
session = future.getSession();
break;
} catch (RuntimeIoException e) {
System.err.println("Failed to connect.");
e.printStackTrace();
Thread.sleep(5000);
}
}
// wait until the summation is done
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
}
4.客户端的消息处理器
package org.apache.mina.example.reverser;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class ReverseClientHandler extends IoHandlerAdapter
{
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception
{
// TODO Auto-generated method stub
super.exceptionCaught(session, cause);
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception
{
String msg = (String)message;
System.out.println("Server sent message :"+msg);
session.write(msg);
}
@Override
public void sessionClosed(IoSession session) throws Exception
{
session.close(true);
}
@Override
public void sessionCreated(IoSession session) throws Exception
{
// TODO Auto-generated method stub
super.sessionCreated(session);
}
@Override
public void sessionOpened(IoSession session) throws Exception
{
session.write("我是好人");
}
}
然后:先启动服务器端Main,然后启动MyClient,跑起来吧。