当前版本:jdk1.8

1. 声明

当前内容主要为本人学习apache mina,主要为记录学习的demo,当前内容主要借鉴官方tcp的demo

基本依赖:

<!-- https://mvnrepository.com/artifact/org.apache.mina/mina-core -->
<dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>2.1.5</version>
</dependency>

2. 服务器端

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.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;/*** * @author hy* @createTime 2021-12-26 09:34:27* @description 这个为时间服务器(专门提供时间的)**/
public class TimeServer {private static final int PORT = 8086;public static void main(String[] args) throws IOException {IoAcceptor acceptor = new NioSocketAcceptor();acceptor.getFilterChain().addLast("logger", new LoggingFilter());acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));acceptor.setHandler(new TimeServerHandler());acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);acceptor.bind(new InetSocketAddress(PORT));System.out.println("启动服务在端口:"+PORT);}
}

服务器端的处理Handler

import java.util.Date;import org.apache.mina.core.service.IoHandler;
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.filter.FilterEvent;public class TimeServerHandler extends IoHandlerAdapter {@Overridepublic void exceptionCaught(IoSession session, Throwable cause) throws Exception {System.out.println("服务器出现错误:"+cause.getMessage());}@Overridepublic void messageReceived(IoSession session, Object message) throws Exception {String str = message.toString();System.out.println("Server Received Message :"+str);if (str.trim().equalsIgnoreCase("quit")) {session.close();return;}Date date = new Date();session.write(date.toString());System.out.println("Message written...");}@Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception {System.out.println("IDLE " + session.getIdleCount(status));}}

主要实现功能:客户端发送消息后自动回复当前的时间给客户端

3. 客户端

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;/*** * @author hy* @createTime 2021-12-26 09:53:44* @description 时间的客户端,用于和当前的TimeServer进行通信用的**/
public class TimeClient {public static void main(String[] args) {IoConnector connector = new NioSocketConnector();connector.getFilterChain().addLast("logger", new LoggingFilter());connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));connector.setHandler(new TimeClientHandler());connector.getSessionConfig().setReadBufferSize(2048);connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);connector.setConnectTimeoutMillis(60000L);InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 8086);// connector.setDefaultLocalAddress(inetSocketAddress);connector.setDefaultRemoteAddress(inetSocketAddress);ConnectFuture connect = connector.connect(inetSocketAddress);try {// 等待连接connect.await(60, TimeUnit.SECONDS);System.out.println("client connected to server...");IoSession session = connect.getSession();Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入:");String line = scanner.nextLine();if (line == null) {continue;}session.write(line);if ("quit".equals(line)) {break;}}scanner.close();session.closeNow();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}connector.dispose();System.out.println("client shutdown");}
}

当前内容中必须使用connect.await,否则得到的session就是null,导致后面报错

客户端的Handler

public class TimeClientHandler extends IoHandlerAdapter {@Overridepublic void sessionCreated(IoSession session) throws Exception {// TODO Auto-generated method stubsuper.sessionCreated(session);}@Overridepublic void exceptionCaught(IoSession session, Throwable cause) throws Exception {// TODO Auto-generated method stubsuper.exceptionCaught(session, cause);session.closeNow();}@Overridepublic void messageReceived(IoSession session, Object message) throws Exception {// TODO Auto-generated method stubsuper.messageReceived(session, message);System.out.println("client received message :" + message);}}

4. 测试

1.启动服务器

2.启动客户端

3.开始发送消息

测试成功

5. 总结

1. 在Apache mina中有IoConnector(客户端)和IoAcceptor(服务器)
2.服务器和客户端都遵循一定的解码规则(类似Netty),只使用一个ProtocolCodecFilter进行进站和出站的规则(Netty中需要定义进出站规则两个)

Apache Mina:一个简单的tcp通信demo相关推荐

  1. QT5实现简单的TCP通信Client端

    QT5实现简单的TCP通信Client端 基本步骤 完整代码 运行结果 最近学习了QT的TCP通信,与大家分享下刚开始写TCP通信的一些经验.下面简单写了个TCP客户端的小例程. 基本步骤 新建一个工 ...

  2. 一个简单的Webservice的demo(中)_前端页面调用

    首先新建项目,这里有两种调用方式,为了能方便理解,新建页面WebserviceTest如下图: 先引用写好的服务,这里用上次写好的服务.见上次写的一个简单的Webservice的demo,简单模拟服务 ...

  3. 笨办法学C 练习45:一个简单的TCP/IP客户端

    练习45:一个简单的TCP/IP客户端 原文:Exercise 45: A Simple TCP/IP Client 译者:飞龙 我打算使用RingBuffer来创建一个非常简单的小型网络测试工具,叫 ...

  4. swift for循环_Swift | 实战一个简单的素数计算器demo

    Swift 实战一个简单的素数计算器demo 本期我们来介绍如何用storyboard来实现一个素数计算器demo,storyboard可以明确地知道界面上的组件与代码的关系,而且比起仅用代码写要方便 ...

  5. 创建一个简单的springboot项目demo

    springboot的核心功能: 1:起步依赖 2:核心注入; 创建一个简单的springboot项目demo步骤: 1:创建一个maven项目 2:pom.xml添加起步依赖 <parent& ...

  6. java 客户端 tcp_一个简单的Tcp客户端

    一个简单的Tcp客户端 import java.io.InputStream; import java.net.InetAddress; import java.net.Socket; public ...

  7. UIAutomator2 一个简单的练手demo,自动刷东方头条

    UIAutomator2 一个简单的练手demo,自动刷东方头条 兼容不是很好,还有情况没有写 import uiautomator2 as u2 import timen = 0#连接设备 # if ...

  8. Qt + Opencv 实现的一个简单文字识别的demo

    Qt + Opencv 实现的一个简单文字识别的demo 很久没用Qt了,这两天结合Opencv整了一个简单文字识别的demo,太久没用了,很多东西都忘记了,中间碰到了几个不大不小的坑,最后都解决了, ...

  9. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)

    文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...

最新文章

  1. 180W多路输出式单片精密开关电源电路及分析
  2. vsftpd匿名用户访问
  3. mysql控制台增加一个用户_MySQL 纯命令行添加用户
  4. form插件的核心方法--ajaxForm(),ajaxSubmit()
  5. ios url缓存策略——NSURLCache、 NSURLRequest
  6. Spring点滴二:Spring Bean
  7. Python中的目录树列表
  8. HTML的快速写法:Emmet和Haml
  9. Spine(2d动画制作软件)绿色中文最终优化版V3.8.75 | spine动画软件下载
  10. 金山毒霸2011进程合并更新 更顺畅运行电脑
  11. 变色龙引导安装mac
  12. win10分辨率设置_雷电模拟器如何设置分辨率
  13. 蓝桥杯入门练习题斐波那契数列
  14. iOS 应用Archiving问题
  15. 一男老师每日百词转载+连载(1)
  16. java 计算开始时间与结束时间的时间差 精确到秒
  17. 计算机毕业论文致谢信范文,计算机毕业论文致谢
  18. JAVA简单的银行管理系统
  19. 自学单片机难吗?单片机编程教学怎么选?
  20. 所有的 Boost 库文档的索引

热门文章

  1. BlackBerry应用程序之间通过persistant store传递数据
  2. office系列调节背景主题
  3. java查找第k大的数字_[经典算法题]寻找数组中第K大的数的方法总结
  4. 字符串的一系列方法以及函数传参
  5. 怎么才能让Antd中的嵌套子表格渲染不一样的内容
  6. 【虹科】使用 ntopng 和 SNMP 监视网络设备
  7. php 构造函数参数
  8. matlab halcon,Halcon-Matlab 图像匹配
  9. 关于soapUI工具调试webService接口简单示例
  10. table表格单元格合并,(自定义)