[b]ä¸.ç®ä»[/b]
MINAæ¯ä¸ä¸ªç½ç»åºç¨æ¡æ¶ï¼ä¹å¯è¢«ç§°ä¹ä¸ºNIOæ¡æ¶åºã客æ·ç«¯/æå¡å¨æ¡æ¶åºãç½ç»å¥æ¥å (socket)åºï¼å¯ä»¥å¸®å©ç¨æ·å¼å髿§è½åé«å¯æ©å±æ§çç½ç»åºç¨ç¨åºï¼æ¯æ(TCP/IPãUDP/IPåè®®)çã
[b]äº.工使µç¨[/b]
MINAå¤äºä¸é´å±ï¼å®ä¸å ³å¿æ°æ®æ¯å¦ä½å¨åºå±ç½ç»è¿è¡ä¼ è¾ï¼åªè´è´£æ¥ååºå±æ°æ®ï¼å°æ°æ®éè¿è¿æ»¤å¨è¿æ»¤å¹¶è£ æ¢æJAVA对象ï¼ä¾åºç¨ç¨åºä½¿ç¨ï¼ç¶åå¨åºç¨ç¨åºå¯¹æ°æ®åè¿ä¸å¡å¤çä¹åï¼å°ååºå¼è¿æ»¤ä¸è½¬æ¢æåºå±è½è¯å«çäºè¿å¶æ°æ®ï¼æä¾ç»åºå±ä¼ è¾ãæ»ä¹ï¼MINAæ¯åºå±æ°æ®ååºç¨ç¨åºäº¤äºçæ¥å£ã
[color=red]ç¬¬ä¸æ¥ï¼å建æå¡å¯¹è±¡(æå¡ç«¯ã客æ·ç«¯) ----IoServiceæ¥å£å®ç°
ç¬¬äºæ¥ï¼æ°æ®è¿æ»¤(ç¼è§£ç å¨) ----IoFilteræ¥å£å®ç°
ç¬¬ä¸æ¥ï¼ä¸å¡å¤ç ----IoHandleræ¥å£å®ç°[/color]
IoFilteræ¯MINAçç²¾é«ï¼å¯ä»¥è¿è¡æ¥å¿è®°å½ï¼ä¿¡æ¯è¿æ»¤ï¼ç¼è§£ç çæä½ï¼ææ°æ®æ¥æ¶åéä»ä¸å¡å±ç¬ç«åºæ¥ã
IoService对NIOè¿è¡äºå°è£ ï¼æä¾ç®ä»æ¥å£ï¼æ¥å建æå¡å¯¹è±¡ã
IoHandleræ¯æä»¬æå ³å¿çé¨åï¼è´è´£å¯¹æ¥æ¶/åéæ°æ®åäºä¸å¡é»è¾å¤ç
[b]ä¸.æå¡ç«¯å®ä¾[/b]
private static Logger logger = Logger.getLogger(Demo1Server.class);
private static final int PORT = 3005;
public static void main(String[] args) {
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.addListener(new ServerListener());
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new MyTextLineCodecFactory()));
// è®¾ç½®è¯»åæ°æ®çç¼å²åºå¤§å°
acceptor.getSessionConfig().setReadBufferSize(2048);
// 读åéé10ç§å
æ æä½è¿å
¥ç©ºé²ç¶æ
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// ç»å®é»è¾å¤çèµ·å¨
acceptor.setHandler(new Demo1ServerHandler());
// ç»å®ç«¯å£
try {
acceptor.bind(new InetSocketAddress(PORT));
logger.info("æå¡å¨å¯å¨æåãããã端å£ä¸ºï¼" + PORT);
} catch (IOException e) {
logger.error("æå¡å¨å¯å¨å¼å¸¸ãããã", e);
e.printStackTrace();
}
}
[b]å.客æ·ç«¯å®ä¾[/b]
private Logger logger = Logger.getLogger(Demo2Client.class);
private static final String HOST = "127.0.0.1";
private static final int PORT = 3005;
public static void main(String[] args) {
// å建ä¸ä¸ªéé»å¡ç客æ·ç«¯ç¨åº
IoConnector connector = new NioSocketConnector();
// è®¾ç½®è¿æ¥è¶
æ¶æ¶é´ å使¯«ç§
connector.setConnectTimeout(30000);
// æ·»å è¿æ»¤å¨
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new MyTextLineCodecFactory()));
// æ·»å ä¸å¡é»è¾å¤çç±»
connector.setHandler(new Demo2ClientHandler());
// åå»ºè¿æ¥
IoSession session = null;
try {
ConnectFuture connect = connector.connect(new InetSocketAddress(
HOST, PORT));
// çå¾
è¿æ¥åå»ºå®æ
connect.awaitUninterruptibly();
// è·åsession
session = connect.getSession();
session.write("æç±ä½ ï¼minaï¼ï¼ï¼ï¼");
} catch (Exception e) {
System.out.println("客æ·ç«¯è¿æ¥å¼å¸¸");
}
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
[b]äº.ç¼è§£ç å¨å®ä¾[/b]
[color=darkblue]5.1 ç¼ç å¨[/color]
private Logger logger = Logger.getLogger(MyTextLineCodecEncoder.class);
//å符ç¼ç ç±»å
private Charset charset = Charset.forName("UTF-8");
@Override
public void dispose(IoSession arg0) throws Exception {
}
@Override
public void encode(IoSession arg0, Object obj, ProtocolEncoderOutput out)
throws Exception {
logger.info("å¼å§ç¼ç ...........");
IoBuffer io = IoBuffer.allocate(100).setAutoExpand(true);
CharsetEncoder ce = charset.newEncoder();
io.putString(obj.toString(), ce);
io.put((byte)'\r');
io.put((byte)'\n');
io.flip();
out.write(io);
}
[color=darkblue]5.2 è§£ç å¨[/color]
private Logger logger = Logger.getLogger(MyTextLineCodecDecoder.class);
//å符ç¼ç ç±»å
private Charset charset = Charset.forName("UTF-8");
//è®¾ç½®æ°æ®åæ¾çIoBuffer大å°
private IoBuffer ioBuffer = IoBuffer.allocate(1024).setAutoExpand(true);
@Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
throws Exception {
logger.info("å¼å§è§£ç ...........");
while(in.hasRemaining()){
byte by = in.get();
//å°æ°æ®åæ¾å°IoBufferä¸
ioBuffer.put(by);
//æ°æ®è§£ç ç»ææ è®°
if(by == '\n'){
ioBuffer.flip();
byte[] b = new byte[ioBuffer.limit()];
ioBuffer.get(b);
String msg = new String(b,charset);
//éç½®ioBuffer
ioBuffer = IoBuffer.allocate(100).setAutoExpand(true);
out.write(msg);
}
}
}