您的位置:首页 > 运维架构 > Apache

Apache MiNa 实现多人聊天室

2013-12-04 15:40 288 查看
ApacheMiNa实现多人聊天室

开发环境:

System:Windows

JavaSDK:1.6

IDE:eclipse、MyEclipse6.6

开发依赖库:

Jdk1.4+、mina-core-2.0.4.jar、slf4j-api-1.5.11.jar、slf4j-log4j12-1.5.11.jar

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

http://hoojo.blogjava.net

前不久用Socket写的聊天程序,主要是手机端程序通过Socket连接服务器端的ServerSocket,然后服务器端根据客户端发送过来统一规范的报文。进行解析再用smack框架转发到openfire服务器,最后由openfire服务器向客户端程序发送聊天信息。

最近发现socket服务器资源消耗比较大。我是采用阻塞式多线程通信方式,这种方式会造成大量的服务器资源浪费、长期的占用服务器的CUP调度权,并且会长时间阻塞程序,等待客户端连接、发送消息等。

为了解决上面的状况,ApacheMiNa能很好的解决这个问题。Mina采用的是非阻塞式、单线程、NIO通信方式。

非阻塞式通信的思想是:让一个线程同时完成多件事,这个线程会利用完成这件事的空余时间去完成另一件事,一刻也不闲着。这个线程同时也会不断监控每件事情中需要处理时间的发生,发生一个就处理一件,然后继续监听各自事情。


一、介绍

首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释:

Apache的Mina(MultipurposeInfrastructureNetworkedApplications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使JavaNIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。

ApacheMina也称为:

NIO框架

网络套接字(networkingsocket)类库

事件驱动的异步API(注意:在JDK7中也新增了异步API)

总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!


二、服务器端编码工作

第一步:

使用ApacheMiNa框架,你需要下载jar

下载地址:http://mina.apache.org/dyn/closer.cgi/mina/2.0.4/apache-mina-2.0.4-bin.zip

你需要添加jar如下





如果你使用日志,需要添加日志配置文件log4j.properties

第二步:

编写通信要用的解码工厂和编码器、解码器类,代码如下

packagecom.hoo.mina.code.factory;


importorg.apache.mina.core.session.IoSession;

importorg.apache.mina.filter.codec.ProtocolCodecFactory;

importorg.apache.mina.filter.codec.ProtocolDecoder;

importorg.apache.mina.filter.codec.ProtocolEncoder;

importcom.hoo.mina.code.CharsetDecoder;

importcom.hoo.mina.code.CharsetEncoder;


/**

*<b>function:</b>字符编码、解码工厂类,编码过滤工厂

*@authorhoojo

*@createDate2012-6-26下午01:08:50

*@fileCharsetCodecFactory.java

*@packagecom.hoo.mina.code.factory

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassCharsetCodecFactoryimplementsProtocolCodecFactory{


@Override

publicProtocolDecodergetDecoder(IoSessionsession)throwsException{

returnnewCharsetDecoder();

}


@Override

publicProtocolEncodergetEncoder(IoSessionsession)throwsException{

returnnewCharsetEncoder();

}

}


解码类

packagecom.hoo.mina.code;


importjava.nio.charset.Charset;

importorg.apache.log4j.Logger;

importorg.apache.mina.core.buffer.IoBuffer;

importorg.apache.mina.core.session.IoSession;

importorg.apache.mina.filter.codec.ProtocolDecoder;

importorg.apache.mina.filter.codec.ProtocolDecoderOutput;


/**

*<b>function:</b>字符解码

*@authorhoojo

*@createDate2012-6-26上午11:14:18

*@fileCharsetDecoder.java

*@packagecom.hoo.mina.code

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassCharsetDecoderimplementsProtocolDecoder{


privatefinalstaticLoggerlog=Logger.getLogger(CharsetDecoder.class);


privatefinalstaticCharsetcharset=Charset.forName("UTF-8");

//可变的IoBuffer数据缓冲区

privateIoBufferbuff=IoBuffer.allocate(100).setAutoExpand(true);


@Override

publicvoiddecode(IoSessionsession,IoBufferin,ProtocolDecoderOutputout)throwsException{

log.info("#########decode#########");


//如果有消息

while(in.hasRemaining()){

//判断消息是否是结束符,不同平台的结束符也不一样;

//windows换行符(\r\n)就认为是一个完整消息的结束符了;UNIX是\n;MAC是\r

byteb=in.get();

if(b=='\n'){

buff.flip();

byte[]bytes=newbyte[buff.limit()];

buff.get(bytes);

Stringmessage=newString(bytes,charset);


buff=IoBuffer.allocate(100).setAutoExpand(true);


//如果结束了,就写入转码后的数据

out.write(message);

//log.info("message:"+message);

}else{

buff.put(b);

}

}

}


@Override

publicvoiddispose(IoSessionsession)throwsException{

log.info("#########dispose#########");

log.info(session.getCurrentWriteMessage());

}


@Override

publicvoidfinishDecode(IoSessionsession,ProtocolDecoderOutputout)throwsException{

log.info("#########完成解码#########");

}

}


上面的decode方法是解码方法,它主要是把读取到数据中的换行符去掉。因为在mina通信协议中以换行符为结束符,如果不定义结束符那么程序会在那里一直等待下一条发送的数据。

这里用到了IoBuffer,MiNa中传输的所有二进制信息都存放在IoBuffer中,IoBuffer是对JavaNIO中ByteBuffer的封装(Mina2.0以前版本这个接口也是ByteBuffer),提供了更多操作二进制数据,对象的方法,并且存储空间可以自增长,用起来非常方便;简单理解,它就是个可变长度的byte字节数组!

1.staticIoBufferallocate(intcapacity,booleanuseDirectBuffer)

创建IoBuffer实例,第一个参数指定初始化容量,第二个参数指定使用直接缓冲区还是J***A内存堆的缓存区,默认为false。

2.IoBuffersetAutoExpand(booleanautoExpand)

这个方法设置IoBuffer为自动扩展容量,也就是前面所说的长度可变,那么可以看出长度可变这个特性默认是不开启的。

3.IoBufferflip()

limit=position,position=0,重置mask,为了读取做好准备,一般是结束buffer操作,将buffer写入输出流时调用;这个必须要调用,否则极有可能position!=limit,导致position后面没有数据;每次写入数据到输出流时,必须确保position=limit。

4.IoBufferclear()与IoBufferreset()

clear:limit=capacity,position=0,重置mark;它是不清空数据,但从头开始存放数据做准备---相当于覆盖老数据。

reset就是清空数据

5.intremaining()与booleanhasRemaining()

这两个方法一般是在调用了flip方法后使用的,remaining()是返回limt-position的值!hasRemaining()则是判断当前是否有数据,返回position<limit的boolean值!

编码类

packagecom.hoo.mina.code;


importjava.nio.charset.Charset;

importorg.apache.log4j.Logger;

importorg.apache.mina.core.buffer.IoBuffer;

importorg.apache.mina.core.session.IoSession;

importorg.apache.mina.filter.codec.ProtocolEncoder;

importorg.apache.mina.filter.codec.ProtocolEncoderOutput;

importorg.apache.mina.filter.codec.textline.LineDelimiter;


/**

*<b>function:</b>字符编码

*@authorhoojo

*@createDate2012-6-26上午11:32:05

*@fileCharsetEncoder.java

*@packagecom.hoo.mina.code

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassCharsetEncoderimplementsProtocolEncoder{

privatefinalstaticLoggerlog=Logger.getLogger(CharsetEncoder.class);

privatefinalstaticCharsetcharset=Charset.forName("UTF-8");


@Override

publicvoiddispose(IoSessionsession)throwsException{

log.info("#############dispose############");

}


@Override

publicvoidencode(IoSessionsession,Objectmessage,ProtocolEncoderOutputout)throwsException{

log.info("#############字符编码############");

IoBufferbuff=IoBuffer.allocate(100).setAutoExpand(true);

buff.putString(message.toString(),charset.newEncoder());

//put当前系统默认换行符

buff.putString(LineDelimiter.DEFAULT.getValue(),charset.newEncoder());

//为下一次读取数据做准备

buff.flip();


out.write(buff);

}

}


第三步:

编写IoHandler实现类代码,IoHander这里是Io读写的事件驱动类,这里的Io操作都会触发里面的事件。你所有的业务逻辑都应当在这个类中完成。

packagecom.hoo.mina.server.message;


importjava.text.SimpleDateFormat;

importjava.util.Collection;

importjava.util.Date;

importorg.apache.mina.core.future.CloseFuture;

importorg.apache.mina.core.future.IoFuture;

importorg.apache.mina.core.future.IoFutureListener;

importorg.apache.mina.core.service.IoHandler;

importorg.apache.mina.core.session.IdleStatus;

importorg.apache.mina.core.session.IoSession;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;


/**

*<b>function:</b>处理服务器端消息

*@authorhoojo

*@createDate2012-6-26下午01:12:34

*@fileServerMessageHandler.java

*@packagecom.hoo.mina.server.message

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassServerMessageHandlerimplementsIoHandler{


privatefinalstaticLoggerlog=LoggerFactory.getLogger(ServerMessageHandler.class);


@Override

publicvoidexceptionCaught(IoSessionsession,Throwablecause)throwsException{

log.info("服务器发生异常:{}",cause.getMessage());

}


@Override

publicvoidmessageReceived(IoSessionsession,Objectmessage)throwsException{

log.info("服务器接收到数据:{}",message);

Stringcontent=message.toString();

SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");

Stringdatetime=sdf.format(newDate());


log.info("转发messageReceived:"+datetime+"\t"+content);


//拿到所有的客户端Session

Collection<IoSession>sessions=session.getService().getManagedSessions().values();

//向所有客户端发送数据

for(IoSessionsess:sessions){

sess.write(datetime+"\t"+content);

}

}


@Override

publicvoidmessageSent(IoSessionsession,Objectmessage)throwsException{

log.info("服务器发送消息:{}",message);

}


@Override

publicvoidsessionClosed(IoSessionsession)throwsException{

log.info("关闭当前session:{}#{}",session.getId(),session.getRemoteAddress());


CloseFuturecloseFuture=session.close(true);

closeFuture.addListener(newIoFutureListener<IoFuture>(){

publicvoidoperationComplete(IoFuturefuture){

if(futureinstanceofCloseFuture){

((CloseFuture)future).setClosed();

log.info("sessionClosedCloseFuturesetClosed-->{},",future.getSession().getId());

}

}

});

}


@Override

publicvoidsessionCreated(IoSessionsession)throwsException{

log.info("创建一个新连接:{}",session.getRemoteAddress());

session.write("welcometothechatroom!");

}


@Override

publicvoidsessionIdle(IoSessionsession,IdleStatusstatus)throwsException{

log.info("当前连接{}处于空闲状态:{}",session.getRemoteAddress(),status);

}


@Override

publicvoidsessionOpened(IoSessionsession)throwsException{

log.info("打开一个session:{}#{}",session.getId(),session.getBothIdleCount());

}

}


sessionCreated:当一个新的连接建立时,由I/Oprocessorthread调用;

sessionOpened:当连接打开是调用;

messageReceived:当接收了一个消息时调用;

messageSent:当一个消息被(IoSession#write)发送出去后调用;

sessionIdle:当连接进入空闲状态时调用;

sessionClosed:当连接关闭时调用;

exceptionCaught:实现IoHandler的类抛出异常时调用;

一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSession的write方法发送出消息!(注意:这里接收到的消息都是Java对象,在IoFilter中所有二进制数据都被解码)一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以!

Iohandler的7个方法其实是根据session的4个状态值间变化来调用的:

Connected:会话被创建并使用;

Idle:会话在一段时间(可配置)内没有任何请求到达,进入空闲状态;

Closing:会话将被关闭(剩余message将被强制flush);

Closed:会话被关闭;

状态转换图如下:





第四步:

编写server启动类,bind端口、设置编码过程和核心业务处理器

packagecom.hoo.mina.server;


importjava.io.IOException;

importjava.net.InetSocketAddress;

importorg.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;

importorg.apache.mina.core.session.IdleStatus;

importorg.apache.mina.filter.codec.ProtocolCodecFilter;

importorg.apache.mina.transport.socket.SocketAcceptor;

importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;

importcom.hoo.mina.code.factory.CharsetCodecFactory;

importcom.hoo.mina.server.message.ServerMessageHandler;


/**

*<b>function:</b>服务器启动类

*@authorhoojo

*@createDate2012-6-29下午07:11:00

*@fileMinaServer.java

*@packagecom.hoo.mina.server

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassMinaServer{


privateSocketAcceptoracceptor;


publicMinaServer(){

//创建非阻塞的server端的Socket连接

acceptor=newNioSocketAcceptor();

}


publicbooleanstart(){

DefaultIoFilterChainBuilderfilterChain=acceptor.getFilterChain();

//添加编码过滤器处理乱码、编码问题

filterChain.addLast("codec",newProtocolCodecFilter(newCharsetCodecFactory()));


/*LoggingFilterloggingFilter=newLoggingFilter();

loggingFilter.setMessageReceivedLogLevel(LogLevel.INFO);

loggingFilter.setMessageSentLogLevel(LogLevel.INFO);

//添加日志过滤器

filterChain.addLast("loger",loggingFilter);*/


//设置核心消息业务处理器

acceptor.setHandler(newServerMessageHandler());

//设置session配置,30秒内无操作进入空闲状态

acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,30);


try{

//绑定端口3456

acceptor.bind(newInetSocketAddress(3456));

}catch(IOExceptione){

e.printStackTrace();

returnfalse;

}

returntrue;

}


publicstaticvoidmain(String[]args){

MinaServerserver=newMinaServer();

server.start();

}

}


上面的代码主要完成启动参数的设置,如端口、session参数;消息核心业务处理器,这个比较关键,我们所有的业务都要在这里完成;然后就是日志、编码过滤器,我们可以对发送或接收到的消息进行处理、编码操作,在网络中传递数据都是字节流传递的,我们要获取消息必须把二进制的字节流转换的字符串来处理,所以这个也是必须的;同时你还可以对服务器添加日志过滤器,来显示日志。

这样服务器端程序就已经完成,你可以用socket或minaclient等方式连接服务器,进行通信。

启动服务器,在浏览器中输入http://localhost:3456这里的服务器绑定的端口是3456

然后你在控制台中可以看到当前浏览器的一些基本信息,如果你看到这些信息就表示你服务器代码编写没有什么问题,应该可以成功建立客户端连接。信息如下:

2012-08-0109:55:56,046INFO[com.hoo.mina.server.message.ServerMessageHandler:75-NioProcessor-1]-创建一个新连接:/127.0.0.1:2542

2012-08-0109:55:56,046INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-1]-#############字符编码############

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:86-NioProcessor-1]-打开一个session:3#0

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:55-NioProcessor-1]-服务器发送消息:welcometothechatroom!

2012-08-0109:55:56,062INFO[com.hoo.mina.code.CharsetDecoder:31-NioProcessor-1]-#########decode#########

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:38-NioProcessor-1]-服务器接收到数据:GET/HTTP/1.1

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:43-NioProcessor-1]-转发messageReceived:2012-08-0109:55:56GET/HTTP/1.1

2012-08-0109:55:56,062INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-1]-#############字符编码############

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:38-NioProcessor-1]-服务器接收到数据:Host:localhost:3456

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:43-NioProcessor-1]-转发messageReceived:2012-08-0109:55:56Host:localhost:3456

2012-08-0109:55:56,062INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-1]-#############字符编码############

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:38-NioProcessor-1]-服务器接收到数据:User-Agent:Mozilla/5.0(WindowsNT5.1;rv:14.0)Gecko/20100101Firefox/14.0.1

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:43-NioProcessor-1]-转发messageReceived:2012-08-0109:55:56User-Agent:Mozilla/5.0(WindowsNT5.1;rv:14.0)Gecko/20100101Firefox/14.0.1

2012-08-0109:55:56,062INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-1]-#############字符编码############

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:38-NioProcessor-1]-服务器接收到数据:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

2012-08-0109:55:56,062INFO[com.hoo.mina.server.message.ServerMessageHandler:43-NioProcessor-1]-转发messageReceived:2012-08-0109:55:56Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

其他内容省略……



三、客户端编码工作

第一步:

编写客户端消息核心处理业务类型,消息处理器

packagecom.hoo.mina.client.message;


importorg.apache.mina.core.service.IoHandlerAdapter;

importorg.apache.mina.core.session.IoSession;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;


/**

*<b>function:</b>客户端消息处理类

*@authorhoojo

*@createDate2012-6-29下午07:24:22

*@fileClientMessageHandlerAdapter.java

*@packagecom.hoo.mina.client.message

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassClientMessageHandlerAdapterextendsIoHandlerAdapter{


privatefinalstaticLoggerlog=LoggerFactory.getLogger(ClientMessageHandlerAdapter.class);


publicvoidmessageReceived(IoSessionsession,Objectmessage)throwsException{

Stringcontent=message.toString();

log.info("clientreceiveamessageis:"+content);

}


publicvoidmessageSent(IoSessionsession,Objectmessage)throwsException{

log.info("messageSent客户端发送消息:"+message);

}


@Override

publicvoidexceptionCaught(IoSessionsession,Throwablecause)throwsException{

log.info("服务器发生异常:{}",cause.getMessage());

}

}


这里我们没有实现IoHandler这个接口,而是继承了IoHandlerAdapter这类,覆盖了messageReceived、messageSent这两个方法。IoHandlerAdapter是IoHandler接口的一个实现,我们这里没有必要实现IoHandler的所有方法。

第二步:

编写连接服务器的代码,设置核心消息处理器

packagecom.hoo.mina.client;


importjava.net.InetSocketAddress;

importorg.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;

importorg.apache.mina.core.future.CloseFuture;

importorg.apache.mina.core.future.ConnectFuture;

importorg.apache.mina.core.session.IoSession;

importorg.apache.mina.filter.codec.ProtocolCodecFilter;

importorg.apache.mina.transport.socket.SocketConnector;

importorg.apache.mina.transport.socket.nio.NioSocketConnector;

importcom.hoo.mina.client.message.ClientMessageHandlerAdapter;

importcom.hoo.mina.code.factory.CharsetCodecFactory;


/**

*<b>function:</b>mina客户端

*@authorhoojo

*@createDate2012-6-29下午07:28:45

*@fileMinaClient.java

*@packagecom.hoo.mina.client.message

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassMinaClient{


privateSocketConnectorconnector;

privateConnectFuturefuture;

privateIoSessionsession;


publicbooleanconnect(){


//创建一个socket连接

connector=newNioSocketConnector();

//设置链接超时时间

connector.setConnectTimeoutMillis(3000);

//获取过滤器链

DefaultIoFilterChainBuilderfilterChain=connector.getFilterChain();

//添加编码过滤器处理乱码、编码问题

filterChain.addLast("codec",newProtocolCodecFilter(newCharsetCodecFactory()));


/*

//日志

LoggingFilterloggingFilter=newLoggingFilter();

loggingFilter.setMessageReceivedLogLevel(LogLevel.INFO);

loggingFilter.setMessageSentLogLevel(LogLevel.INFO);

filterChain.addLast("loger",loggingFilter);*/


//消息核心处理器

connector.setHandler(newClientMessageHandlerAdapter());


//连接服务器,知道端口、地址

future=connector.connect(newInetSocketAddress(3456));

//等待连接创建完成

future.awaitUninterruptibly();

//获取当前session

session=future.getSession();

returntrue;

}


publicvoidsetAttribute(Objectkey,Objectvalue){

session.setAttribute(key,value);

}


publicvoidsend(Stringmessage){

session.write(message);

}


publicbooleanclose(){

CloseFuturefuture=session.getCloseFuture();

future.awaitUninterruptibly(1000);

connector.dispose();

returntrue;

}


publicSocketConnectorgetConnector(){

returnconnector;

}


publicIoSessiongetSession(){

returnsession;

}

}


第三步:

完成启动、在控制台输入你发送的内容

packagecom.hoo.mina.client.main;


importjava.util.Scanner;

importcom.hoo.mina.client.MinaClient;


/**

*<b>function:</b>运行客户端程序

*@authorhoojo

*@createDate2012-6-29下午07:36:44

*@fileRunClient.java

*@packagecom.hoo.mina.client.main

*@projectApacheMiNa

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassRunClient{


publicstaticvoidmain(String[]args){

MinaClientclient=newMinaClient();

if(client.connect()){

client.send("连接服务器成功!");

Scannerscanner=newScanner(System.in);

while(scanner.hasNext()){

client.send(scanner.next());

}

}

}

}


启动服务器,运行客户端程序可以看到控制台:

2012-08-0110:01:15,953INFO[com.hoo.mina.code.CharsetEncoder:34-main]-#############字符编码############

2012-08-0110:01:15,953INFO[com.hoo.mina.code.CharsetDecoder:31-NioProcessor-2]-#########decode#########

2012-08-0110:01:15,953INFO[com.hoo.mina.client.message.ClientMessageHandlerAdapter:25-NioProcessor-2]-clientreceiveamessageis:welcometothechatroom!

2012-08-0110:01:15,984INFO[com.hoo.mina.client.message.ClientMessageHandlerAdapter:29-NioProcessor-2]-messageSent客户端发送消息:连接服务器成功!

2012-08-0110:01:15,984INFO[com.hoo.mina.code.CharsetDecoder:31-NioProcessor-2]-#########decode#########

2012-08-0110:01:15,984INFO[com.hoo.mina.client.message.ClientMessageHandlerAdapter:25-NioProcessor-2]-clientreceiveamessageis:2012-08-0110:01:15


服务器控制台:

2012-08-0110:01:15,921INFO[com.hoo.mina.server.message.ServerMessageHandler:75-NioProcessor-2]-创建一个新连接:/192.168.8.22:2644

2012-08-0110:01:15,937INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-2]-#############字符编码############

2012-08-0110:01:15,937INFO[com.hoo.mina.server.message.ServerMessageHandler:86-NioProcessor-2]-打开一个session:1#0

2012-08-0110:01:15,937INFO[com.hoo.mina.server.message.ServerMessageHandler:55-NioProcessor-2]-服务器发送消息:welcometothechatroom!

2012-08-0110:01:15,984INFO[com.hoo.mina.code.CharsetDecoder:31-NioProcessor-2]-#########decode#########

2012-08-0110:01:15,984INFO[com.hoo.mina.server.message.ServerMessageHandler:38-NioProcessor-2]-服务器接收到数据:连接服务器成功!

2012-08-0110:01:15,984INFO[com.hoo.mina.server.message.ServerMessageHandler:43-NioProcessor-2]-转发messageReceived:2012-08-0110:01:15连接服务器成功!

2012-08-0110:01:15,984INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-2]-#############字符编码############

2012-08-0110:01:15,984INFO[com.hoo.mina.server.message.ServerMessageHandler:55-NioProcessor-2]-服务器发送消息:2012-08-0110:01:15连接服务器成功!

2012-08-0110:01:45,984INFO[com.hoo.mina.server.message.ServerMessageHandler:81-NioProcessor-2]-当前连接/192.168.8.22:2644处于空闲状态:bothidle


在客户端控制台输入聊天内容

hello,MiNaChat~!

2012-08-0110:03:49,093INFO[com.hoo.mina.code.CharsetEncoder:34-main]-#############字符编码############

2012-08-0110:03:49,093INFO[com.hoo.mina.client.message.ClientMessageHandlerAdapter:29-NioProcessor-2]-messageSent客户端发送消息:hello,MiNaChat~!

2012-08-0110:03:49,093INFO[com.hoo.mina.code.CharsetDecoder:31-NioProcessor-2]-#########decode#########

2012-08-0110:03:49,093INFO[com.hoo.mina.client.message.ClientMessageHandlerAdapter:25-NioProcessor-2]-clientreceiveamessageis:2012-08-0110:03:49


服务器端接收到内容

2012-08-0110:03:49,093INFO[com.hoo.mina.code.CharsetDecoder:31-NioProcessor-2]-#########decode#########

2012-08-0110:03:49,093INFO[com.hoo.mina.server.message.ServerMessageHandler:38-NioProcessor-2]-服务器接收到数据:hello,MiNaChat~!

2012-08-0110:03:49,093INFO[com.hoo.mina.server.message.ServerMessageHandler:43-NioProcessor-2]-转发messageReceived:2012-08-0110:03:49hello,MiNaChat~!

2012-08-0110:03:49,093INFO[com.hoo.mina.code.CharsetEncoder:34-NioProcessor-2]-#############字符编码############

2012-08-0110:03:49,093INFO[com.hoo.mina.server.message.ServerMessageHandler:55-NioProcessor-2]-服务器发送消息:2012-08-0110:03:49hello,MiNaChat~!

2012-08-0110:04:19,093INFO[com.hoo.mina.server.message.ServerMessageHandler:81-NioProcessor-2]-当前连接/192.168.8.22:2644处于空闲状态:bothidle




作者:hoojo

出处:'target='_blank'>http://www.blogjava.net/hoojo/archive/2012/08/01/384490.html
blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权所有,转载请注明出处本文出自:'target='_blank'>http://www.blogjava.net/hoojo/archive/2012/08/01/384490.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: