手机端小强原创文章,java小强个人博客站点
当前位置: 首页 >> 开源 >> Mina TCP服务端客户端 示例

Mina TCP服务端客户端 示例

22410 开源 | 2014-7-30

服务端代码:

package com.xd.nms.example;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import com.xd.nms.util.ByteAndStr16;
/**
 * @说明 Mina TCP 服务端
 * @author 
 * @version 1.0
 * @since
 */
public class MinaTcpServer extends IoHandlerAdapter {
 public static final int PORT = 18567;
 public MinaTcpServer() throws IOException {
  NioSocketAcceptor acceptor = new NioSocketAcceptor();
  acceptor.setHandler(this);
  acceptor.bind(new InetSocketAddress(PORT));
  System.out.println("TCP服务启动,端口:" + PORT);
 }
 public static void main(String[] args) throws IOException {
  new MinaTcpServer();
 }
 @Override
 public void messageReceived(IoSession session, Object message)
   throws Exception {
  IoBuffer bbuf = (IoBuffer) message;
  byte[] byten = new byte[bbuf.limit()];
  bbuf.get(byten, bbuf.position(), bbuf.limit());
  System.out.println("收到消息:" + ByteAndStr16.Bytes2HexString(byten));
  byte[] bts = new byte[10];
  for(int i=0;i<10;i++){
   bts[i] = (byte)i;
  }
  IoBuffer buffer = IoBuffer.allocate(10);
  buffer.put(bts);
  buffer.flip();
  session.write(buffer);
//  // 拿到所有的客户端Session
//  Collection<IoSession> sessions = session.getService().getManagedSessions().values();
//  // 向所有客户端发送数据
//  for (IoSession sess : sessions) {
//   sess.write(buffer);
//  }
 }
 @Override
 public void sessionClosed(IoSession session) throws Exception {
  System.out.println("会话关闭");
 }
 @Override
 public void exceptionCaught(IoSession session, Throwable cause)
   throws Exception {
  System.out.println("会话异常");
  super.exceptionCaught(session, cause);
 }
 @Override
 public void messageSent(IoSession iosession, Object obj) throws Exception {
  System.out.println("服务端消息发送");
  super.messageSent(iosession, obj);
 }
 @Override
 public void sessionCreated(IoSession iosession) throws Exception {
  System.out.println("会话创建");
  super.sessionCreated(iosession);
 }
 @Override
 public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
   throws Exception {
  System.out.println("会话休眠");
  super.sessionIdle(iosession, idlestatus);
 }
 @Override
 public void sessionOpened(IoSession iosession) throws Exception {
  System.out.println("会话打开");
  super.sessionOpened(iosession);
 }
}

服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去

注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的

 

客户端程序:

package com.xd.nms.example;
import java.net.InetSocketAddress;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import com.xd.nms.util.ByteAndStr16;
/**
 * @说明 Mina TCP客户端
 * @author 
 * @version 1.0
 * @since
 */
public class MinaTcpClient extends IoHandlerAdapter {
 private IoConnector connector;
 private static IoSession session;
 public MinaTcpClient() {
  connector = new NioSocketConnector();
  connector.setHandler(this);
  ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT));
  connFuture.awaitUninterruptibly();
  session = connFuture.getSession();
  System.out.println("TCP 客户端启动");
 }
 public static void main(String[] args) throws Exception {
  MinaTcpClient client = new MinaTcpClient();
  for(int j=0;j<2;j++){ // 发送两遍
   byte[] bts = new byte[20];
   for (int i = 0; i < 20; i++) {
    bts[i] = (byte) i;
   }
   IoBuffer buffer = 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
 public void messageReceived(IoSession iosession, Object message)
   throws Exception {
  IoBuffer bbuf = (IoBuffer) message;
  byte[] byten = new byte[bbuf.limit()];
  bbuf.get(byten, bbuf.position(), bbuf.limit());
  System.out.println("客户端收到消息" + ByteAndStr16.Bytes2HexString(byten));
 }
 @Override
 public void exceptionCaught(IoSession session, Throwable cause)
   throws Exception {
  System.out.println("客户端异常");
  super.exceptionCaught(session, cause);
 }
 @Override
 public void messageSent(IoSession iosession, Object obj) throws Exception {
  System.out.println("客户端消息发送");
  super.messageSent(iosession, obj);
 }
 @Override
 public void sessionClosed(IoSession iosession) throws Exception {
  System.out.println("客户端会话关闭");
  super.sessionClosed(iosession);
 }
 @Override
 public void sessionCreated(IoSession iosession) throws Exception {
  System.out.println("客户端会话创建");
  super.sessionCreated(iosession);
 }
 @Override
 public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
   throws Exception {
  System.out.println("客户端会话休眠");
  super.sessionIdle(iosession, idlestatus);
 }
 @Override
 public void sessionOpened(IoSession iosession) throws Exception {
  System.out.println("客户端会话打开");
  super.sessionOpened(iosession);
 }
}

向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!

 

打印结果:

TCP服务启动,端口:18567
会话创建
会话打开
收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 
服务端消息发送
收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 
服务端消息发送
会话关闭

客户端打印:

客户端会话创建
客户端会话打开
TCP 客户端启动
客户端消息发送
客户端收到消息00 01 02 03 04 05 06 07 08 09 
客户端消息发送
客户端收到消息00 01 02 03 04 05 06 07 08 09 
客户端会话关闭

示例仅供参考

推荐您阅读更多有关于“ tcp 网络编程 开源 示例 mina dup ”的文章

上一篇:Mina重连 千万别这么干 下一篇:多线程访问 资源的安全控制

猜你喜欢

发表评论:

个人资料
blogger

java小强
没有思考,人生的路会越走越难!

搜索
分类
最新微语
  • 今天同学问我,最近还在写代码吗?我想了想,这个问题怎么回答呢,我好像确实很长时间,虽然写了一些,但是主要内容已经不是写代码了。然后再想想,自己也7年多了,这么多年了,我收获了什么,我的目标到底是什么。眼看就奔三了,人生啊,开启感叹模式。

    2017-03-30 22:52

  • 也许大家都已经注意到了,今年的房价,好多地方都是翻了一番,跟着就是,各地房东开始变相涨租。今年之所以搬走,就是为此,这两天同学也是如此。很多房东只认钱,别谈感情,伤钱。而对于这个城市来说,你怎么定位自己,你真把自己当成她的一份子?你来此为何?将来何去何从?自己掂量清楚。

    2016-12-05 10:03

  • 为什么一直不写了呢?因为当爸爸了,没空了。今年的冬天,有些寒冷,除了这寒冬带来的不适,更有因乐视公司遇到危机,而带来的同事别离。送别同事,看着空旷的工位,心中有些悲凉。临近年关,此时此刻,该怎么做,似乎不再是脑子一热那么简单了。

    2016-11-24 11:28

  • 已经请假,加上国庆,要很长一段时间不在北京了。919加班,搞的现在有点心累,胸闷,身体不适。看来,我要好好休息一下了。这几天有些冷,2016的冬天,一步步来了,各位亲友,记得添衣加粗啊。

    2016-09-23 17:29

  • 现在是真的有秋天的感觉了,晚上也不热了,白天也凉快了。再来点风,那酸爽,就有一种想出去防风的冲动了。不过因为最近广州的事情压着,我也没办法,搞的特别累,以前是天天加班不想有自由,现在是因为有事情了,被限制了自由。加上公司的一些事情,感觉日子特别的无聊。

    2016-08-31 17:39

  • 更多»

最新文章
热门文章
随机文章