Mina学习+手写服务端+通过telnet连接服务端
1.
2.
3.
4.MinaServer.java
package com.mina;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MinaServer {
//定义端口
static int PORT=7080;
//服务端使用IoAcceptor
static IoAcceptor accept=null;
public static void main(String[] args) {
try {
//创建服务端的socket
accept=new NioSocketAcceptor();
//设置编码过滤器,完成协议的编码和解码
//new ProtocolCodecFilter(factory) factory为处理文本信息
accept.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
//设置缓冲区大小
accept.getSessionConfig().setReadBufferSize(1024);
//设置多长时间读和写,缓冲区没有读和写的空闲时间,超过10ms进入空闲状态
accept.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
//设置处理业务Handler
accept.setHandler(new Myhandler());
//绑定端口号
accept.bind(new InetSocketAddress(PORT));
System.out.println("服务端口号Server-->"+PORT);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Server-->"+PORT);
}
}
5.Myhandler.java
package com.mina;
import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
/**
* 自定义的业务处理对象
* @author xjj13
*
*/
/**
* 选中Myhandler,右键source implement method
* @author xjj13
*
*/
public class Myhandler extends IoHandlerAdapter{
//连接出现异常所调用的方法
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
System.out.println("exceptionCaught");
}
//接受到数据要处理的事情
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg=(String)message;
System.out.println("服务端接收数据:"+msg);
Date date=new Date();
//当客户端输入exit时,退出连接
if (msg.equals("exit")) {
session.close();
}
//服务端接收到数据后发送到客户端
session.write(date);
}
//发送数据出去时要调用的方法
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
}
//session关闭时要调用的方法
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
}
//session创建时要调用的方法
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
//当读写缓冲区都没有超过的时候,多长时间处于空闲状态
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
System.out.println("sessionIdle");
}
//(session创建后的)打开session的方法
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
}
6.MinaServer.java,右键run as-->java application
7.cmd,输入命令telnet 127.0.0.1 7080
输入hello,console输出:
当客端一直不输入数据,就会输出sessionIdle
总结:
1.设置NIOSocket
2.设置编码解码过滤器(可以设置多种过滤器)
3.设置一些session的属性,如:空闲时间,缓冲区大小等
4.绑定一个端口