服务端代码:packagecom.xd.nms.example;
importjava.io.IOException;
.InetSocketAddress;
importorg.apache.mina.core.buffer.IoBuffer;
importorg.apache.mina.core.service.IoHandlerAdapter;
importorg.apache.mina.core.session.IdleStatus;
importorg.apache.mina.core.session.IoSession;
importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;
importcom.xd.nms.util.ByteAndStr16;
/**
*@说明MinaTCP服务端
*@author
*@version1.0
*@since
*/
publicclassMinaTcpServerextendsIoHandlerAdapter{
publicstaticfinalintPORT=18567;
publicMinaTcpServer()throwsIOException{
NioSocketAcceptoracceptor=newNioSocketAcceptor();
acceptor.setHandler(this);
acceptor.bind(newInetSocketAddress(PORT));
System.out.println("TCP服务启动,端口:"+PORT);
}
publicstaticvoidmain(String[]args)throwsIOException{
newMinaTcpServer();
}
@Override
publicvoidmessageReceived(IoSessionsession,Objectmessage)
throwsException{
IoBufferbbuf=(IoBuffer)message;
byte[]byten=newbyte[bbuf.limit()];
bbuf.get(byten,bbuf.position(),bbuf.limit());
System.out.println("收到消息:"+ByteAndStr16.Bytes2HexString(byten));
byte[]bts=newbyte[10];
for(inti=0;i<10;i++){
bts[i]=(byte)i;
}
IoBufferbuffer=IoBuffer.allocate(10);
buffer.put(bts);
buffer.flip();
session.write(buffer);
////拿到所有的客户端Session
//Collectionsessions=session.getService().getManagedSessions().values();
////向所有客户端发送数据
//for(IoSessionsess:sessions){
//sess.write(buffer);
//}
}
@Override
publicvoidsessionClosed(IoSessionsession)throwsException{
System.out.println("会话关闭");
}
@Override
publicvoidexceptionCaught(IoSessionsession,Throwablecause)
throwsException{
System.out.println("会话异常");
super.exceptionCaught(session,cause);
}
@Override
publicvoidmessageSent(IoSessioniosession,Objectobj)throwsException{
System.out.println("服务端消息发送");
super.messageSent(iosession,obj);
}
@Override
publicvoidsessionCreated(IoSessioniosession)throwsException{
System.out.println("会话创建");
super.sessionCreated(iosession);
}
@Override
publicvoidsessionIdle(IoSessioniosession,IdleStatusidlestatus)
throwsException{
System.out.println("会话休眠");
super.sessionIdle(iosession,idlestatus);
}
@Override
publicvoidsessionOpened(IoSessioniosession)throwsException{
System.out.println("会话打开");
super.sessionOpened(iosession);
}
}
服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去
注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的
客户端程序:packagecom.xd.nms.example;
.InetSocketAddress;
importorg.apache.mina.core.buffer.IoBuffer;
importorg.apache.mina.core.future.ConnectFuture;
importorg.apache.mina.core.service.IoConnector;
importorg.apache.mina.core.service.IoHandlerAdapter;
importorg.apache.mina.core.session.IdleStatus;
importorg.apache.mina.core.session.IoSession;
importorg.apache.mina.transport.socket.nio.NioSocketConnector;
importcom.xd.nms.util.ByteAndStr16;
/**
*@说明MinaTCP客户端
*@author
*@version1.0
*@since
*/
publicclassMinaTcpClientextendsIoHandlerAdapter{
privateIoConnectorconnector;
privatestaticIoSessionsession;
publicMinaTcpClient(){
connector=newNioSocketConnector();
connector.setHandler(this);
ConnectFutureconnFuture=connector.connect(newInetSocketAddress("localhost",MinaTcpServer.PORT));
connFuture.awaitUninterruptibly();
session=connFuture.getSession();
System.out.println("TCP客户端启动");
}
publicstaticvoidmain(String[]args)throwsException{
MinaTcpClientclient=newMinaTcpClient();
for(intj=0;j<2;j++){//发送两遍
byte[]bts=newbyte[20];
for(inti=0;i
bts[i]=(byte)i;
}
IoBufferbuffer=IoBuffer.allocate(20);
//自动扩容
buffer.setAutoExpand(true);
//自动收缩
buffer.setAutoShrink(true);
buffer.put(bts);
buffer.flip();
session.write(buffer);
Thread.sleep(2000);
}
//关闭会话,待所有线程处理结束后
client.connector.dispose(true);
}
@Override
publicvoidmessageReceived(IoSessioniosession,Objectmessage)
throwsException{
IoBufferbbuf=(IoBuffer)message;
byte[]byten=newbyte[bbuf.limit()];
bbuf.get(byten,bbuf.position(),bbuf.limit());
System.out.println("客户端收到消息"+ByteAndStr16.Bytes2HexString(byten));
}
@Override
publicvoidexceptionCaught(IoSessionsession,Throwablecause)
throwsException{
System.out.println("客户端异常");
super.exceptionCaught(session,cause);
}
@Override
publicvoidmessageSent(IoSessioniosession,Objectobj)throwsException{
System.out.println("客户端消息发送");
super.messageSent(iosession,obj);
}
@Override
publicvoidsessionClosed(IoSessioniosession)throwsException{
System.out.println("客户端会话关闭");
super.sessionClosed(iosession);
}
@Override
publicvoidsessionCreated(IoSessioniosession)throwsException{
System.out.println("客户端会话创建");
super.sessionCreated(iosession);
}
@Override
publicvoidsessionIdle(IoSessioniosession,IdleStatusidlestatus)
throwsException{
System.out.println("客户端会话休眠");
super.sessionIdle(iosession,idlestatus);
}
@Override
publicvoidsessionOpened(IoSessioniosession)throwsException{
System.out.println("客户端会话打开");
super.sessionOpened(iosession);
}
}
向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!
打印结果:TCP服务启动,端口:18567
会话创建
会话打开
收到消息:000102030405060708090A0B0C0D0E0F10111213
服务端消息发送
收到消息:000102030405060708090A0B0C0D0E0F10111213
服务端消息发送
会话关闭
客户端打印:客户端会话创建
客户端会话打开
TCP客户端启动
客户端消息发送
客户端收到消息00010203040506070809
客户端消息发送
客户端收到消息00010203040506070809
客户端会话关闭
示例仅供参考