.1、前言Apache MINA是Apache组织的一个优秀的项目。MINA是Multipurpose Infrastructure for NetworkApplications的缩写。它是一个网络应用程序框架,用来帮助用户非常方便地开发高性能和高可靠性的网络应用程序。在本文中介绍了 如何通过Apache Mina2.0来实现TCP协议长连接和短连接应用。2、系统介绍2.1系统框架整个系统由两个服务端程序和两个客户端程序组成。分别实现TCP长连接和短连接通信。系统业务逻辑是一个客户端与服务端建立长连接,一个客户端与服务端建立短连接。数据从短连接客户端经过服务端发送到长连接客户端,并从长连接客户端接收响应数据。当收到响应数据后断开连接。系统架构图如下:2.2处理流程系统处理流程如下:1) 启动服务端程序,监听8001和8002端口。2) 长连接客户端向服务端8002端口建立连接,服务端将连接对象保存到共享内存中。由于采用长连接方式,连接对象是唯一的。3) 短连接客户端向服务端8001端口建立连接。建立连接后创建一个连接对象。4) 短连接客户端连接成功后发送数据。服务端接收到数据后从共享内存中得到长连接方式的连接对象,使用此对象向长连接客户端发送数据。发送前将短连接对象设为长连接对象的属性值。5) 长连接客户端接收到数据后返回响应数据。服务端从长连接对象的属性中取得短连接对象,通过此对象将响应数据发送给短连接客户端。6) 短连接客户端收到响应数据后,关闭连接。3、服务端程序3.1长连接服务端服务启动public class MinaLongConnServer {private static final int PORT = 8002; public void start()throws IOException{ IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); acceptor.setHandler(new MinaLongConnServerHandler()); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.bind(new InetSocketAddress(PORT)); System.out.println("Listeningon port " + PORT); }}消息处理public class MinaLongConnServerHandler extends IoHandlerAdapter { private final Logger logger = (Logger) LoggerFactory.getLogger(getClass()); @Override public void sessionOpened(IoSession session) { InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress(); String clientIp = remoteAddress.getAddress().getHostAddress(); logger.info("LongConnect Server opened Session ID ="+String.valueOf(session.getId())); logger.info("接收来自客户端 :" + clientIp + "的连接."); Initialization init = Initialization.getInstance(); HashMap clientMap =init.getClientMap(); clientMap.put(clientIp, session); } @Override public void messageReceived(IoSession session, Object message) { logger.info("Messagereceived in the long connect server.."); String expression = message.toString(); logger.info("Message is:" + expression); IoSession shortConnSession =(IoSession) session.getAttribute("shortConnSession"); logger.info("ShortConnect Server Session ID ="+String.valueOf(shortConnSession.getId())); shortConnSession.write(expression); } @Override public void sessionIdle(IoSession session, IdleStatus status) { logger.info("Disconnectingthe idle."); // disconnect an idle client session.close(true); } @Override public void exceptionCaught(IoSession session, Throwable cause) { // close the connection onexceptional situation logger.warn(cause.getMessage(), cause); session.close(true); }}3.2短连接服务端服务启动public class MinaShortConnServer { private static final int PORT = 8001; public void start()throws IOException{ IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); acceptor.setHandler(new MinaShortConnServerHandler()); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3); acceptor.bind(new InetSocketAddress(PORT)); System.out.println("Listeningon port " + PORT); }}消息处理public class MinaShortConnServerHandler extends IoHandlerAdapter { private final Logger logger = (Logger) LoggerFactory.getLogger(getClass()); @Override public void sessionOpened(IoSession session) { InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress(); logger.info(remoteAddress.getAddress().getHostAddress()); logger.info(String.valueOf(session.getId())); } @Override public void messageReceived(IoSession session, Object message) { logger.info("Messagereceived in the short connect server..."); String expression = message.toString(); Initialization init = Initialization.getInstance(); HashMap clientMap =init.getClientMap(); if (clientMap == null || clientMap.size() == 0) { session.write("error"); } else { IoSession longConnSession = null; Iterator iterator =clientMap.keySet().iterator(); String key = ""; while (iterator.hasNext()) { key = iterator.next(); longConnSession = clientMap.get(key); } logger.info("ShortConnect Server Session ID :"+String.valueOf(session.getId())); logger.info("LongConnect Server Session ID :"+String.valueOf(longConnSession.getId())); longConnSession.setAttribute("shortConnSession",session); longConnSession.write(expression); } } @Override public void sessionIdle(IoSession session, IdleStatus status) { logger.info("Disconnectingthe idle."); // disconnect an idle client session.close(true); } @Override public void exceptionCaught(IoSession session, Throwable cause) { // close the connection onexceptional situation logger.warn(cause.getMessage(), cause); session.close(true); }} 4、客户端程序4.1长连接客户端使用java.net.Socket来实现向服务端建立连接。Socket建立后一直保持连接,从服务端接收到数据包后直接将原文返回。public class TcpKeepAliveClient { private String ip; private int port; private static Socket socket = null; private static int timeout = 50 * 1000; public TcpKeepAliveClient(String ip, int port) { this.ip = ip; this.port = port; } public void receiveAndSend() throws IOException { InputStream input = null; OutputStream output = null; try { if (socket == null || socket.isClosed() || !socket.isConnected()) { socket = new Socket(); InetSocketAddress addr = new InetSocketAddress(ip, port); socket.connect(addr, timeout); socket.setSoTimeout(timeout); System.out.println("TcpKeepAliveClientnew "); } input = socket.getInputStream(); output = socket.getOutputStream(); // read body byte[] receiveBytes = {};// 收到的包字节数组 while (true) { if (input.available() > 0) { receiveBytes = new byte[input.available()]; input.read(receiveBytes); // send System.out.println("TcpKeepAliveClientsend date :" + new String(receiveBytes)); output.write(receiveBytes, 0, receiveBytes.length); output.flush(); } } } catch (Exception e) { e.printStackTrace(); System.out.println("TcpClientnew socket error"); } } public static void main(String[] args) throws Exception { TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002); client.receiveAndSend(); } }4.2短连接客户端服务启动public class MinaShortClient { private static final int PORT = 8001; public static void main(String[] args) throws IOException,InterruptedException { IoConnector connector = new NioSocketConnector(); connector.getSessionConfig().setReadBufferSize(2048); connector.getFilterChain().addLast("logger", new LoggingFilter()); connector.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); connector.setHandler(new MinaShortClientHandler()); for (int i = 1; i <= 10; i++) { ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT)); future.awaitUninterruptibly(); IoSession session =future.getSession(); session.write(i); session.getCloseFuture().awaitUninterruptibly(); System.out.println("result=" + session.getAttribute("result")); } connector.dispose(); }}消息处理public class MinaShortClientHandler extends IoHandlerAdapter{ private final Logger logger = (Logger) LoggerFactory.getLogger(getClass()); public MinaShortClientHandler() { } @Override public void sessionOpened(IoSession session) { } @Override public void messageReceived(IoSession session, Object message) { logger.info("Messagereceived in the client.."); logger.info("Message is:" + message.toString()); session.setAttribute("result", message.toString()); session.close(true); } @Override public void exceptionCaught(IoSession session, Throwable cause) { session.close(true); }}5、总结通过本文中的例子,Apache Mina在服务端可实现TCP协议长连接和短连接。在客户端只实现了短连接模式,长连接模式也是可以实现的(在本文中还是采用传统的java Socket方式)。两个服务端之间通过共享内存的方式来传递连接对象也许有更好的实现方式。
相关推荐
【2023年】云计算比赛——金砖挑战赛正式题
文章摘要 本文详细记录了OpenStack私有云平台与Kubernetes容器云平台的部署与运维过程,涵盖环境初始化、组件安装、服务配置及自动化运维等关键任务。主要内容包括: OpenStack部署 环境初始化(主机名、Yum源、FTP服务等) 核心组件安装(Keystone、Glance、Nova、Neutron等) 运维任务(安全组管理、镜像上传、存储服务配置等) Kubernetes集群搭建 节点配置(时间同步、免密登录) 容器运行时(Docker)与网络插件(Flannel)部署 Harbor私有仓
Mina初识(二)
Apache MINA是Apache组织的一个优秀的项目。主要通过Apache Mina2.0来实现TCP协议长连接和短连接应用。 长连接:同信双方长期保持一个连接状态不断开,除非发生异常,需要消耗更多IO资源。 短连接:通信双方不是保持一个长期连接状态,当客户端发起http请求,服务端处理http请求,当服务器处理完成后,返回客户端数据后就断开连接,对于下次的连接请求需要重新发起连接
观测器选择与工程实践建议
摘要:永磁同步电机(PMSM)无传感器控制中,观测器选型需综合考虑应用场景、性能需求与成本。消费级(家电、工具)推荐滑模观测器(SMO),成本低、鲁棒性强;工业级(伺服、泵阀)适用扩展卡尔曼滤波器(EKF),精度高但计算复杂;车规级(EPS、主驱动)需混合观测器(SMO+EKF),兼顾全速域性能与可靠性。低速时需高频注入法,IPMSM更适用。SMO易实现但存在抖振,EKF调试复杂。未来趋势是混合架构与AI增强,提升适应性与性能。选型需权衡速度范围、电机类型、处理器能力及成本。
C# TCPclient 服务器保持长连接的一种办法(变相的心跳包功能)
本文章向大家介绍C# TCPclient 服务器保持长连接的一种办法(变相的心跳包功能),主要包括C# TCPclient 服务器保持长连接的一种办法(变相的心跳包功能)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Draw...
http、websocket、长连接、短连接(一)
这一篇先讲一下http的长短连接的问题 1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。...
TCP如何建立长连接
如果不主动关闭socket,操作系统是不会将其关闭的,这样socket所在的进程如果没有挂掉,则socket所占用的资源将一直无法回收。在长连接通信过程中,双方的所有通信都建立在1条长连接上(1次TCP连接),因此连接需要持续保持双方连接才可使得双方持续通信。由于TCP建立连接需要进行三次握手,每次建立连接都需要进行资源消耗,对于频繁请求资源的客户端而言,长连接可减少大量开销。需要注意的是,在判断连接是否断开时,可以判断recv函数是否成功,而非send函数。先启动服务端,等待客户端进行连接。
长连接和短连接
长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。 比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
TCP的长连接和短连接
https://www.cnblogs.com/gotodsp/p/6366163.html https://www.cnblogs.com/onlysun/p/4520553.html https://www.cnblogs.com/lancidie/p/4524562.html HTTP的长连接和短连接本质上是TCP长连接和短连接。 当网络通信时采用TCP协议时,在真正的读写操作之前,serv...
TCP长连接和短连接的区别
TCP长连接和短连接的区别 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的 示意图: ...
TCP协议-长连接和短连接
一 前言 TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接。当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接。 TCP连接的建立是通过三次握手,而连接的释放是通过四次挥手。所以说,每个TCP连接的建立和释放都是需要消耗资源和时间成本的。 二 TCP短连接 模拟一种TCP短连接的情况: client 向 server 发起连接请求 server 收到连接请求,双方建立TCP连接 client 向 server 发送消息 server 回应 cl
TCP长连接和短连接
TCP长连接和短连接当网络通信采用TCP协议时,真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要消耗时间和消耗资源的。一、TCP短连接我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连
TCP长连接和短连接-深入浅出(还在总说http长连接吗)
查阅了一些资料,站在前人的肩膀上看世界会很美好。 什么是长连接和短连接 1.官方解释 长连接(long connnection),指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。 短连接(short connnection),是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时才去建立一个连接,数据发送完成后则断开此连接,即每次连接只完成一项业务的发送。 2.通俗一点 长连接:连接->传输数据->保持连接 -> 传输数据-.
TCP 长连接和短连接:
TCP长连接和短连接的区别: 长连接: 1.指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。 2.连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信); 这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态; 3.应用场景: 长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多的情况。因为频繁建立....
TCP是怎么处理长连接、短连接
例如在基于 HTTP 协议的长轮询和 Websocket 协议中,长连接技术被广泛使用,可以在客户端和服务器之间保持长时间的连接,以实现实时数据传输和用户交互。在长连接的情况下,数据传输的速度更快,可以减少网络连接的开销,提高传输效率。在实际应用中,例如基于 HTTP 协议的长轮询和 Websocket 协议等,都是在 TCP 协议之上实现的长连接技术。在短连接的情况下,由于每次传输数据都需要建立连接,因此网络连接的开销比较大,速度相对较慢,适用于数据量小且传输频率不高的场景,如 HTTP 短连接。
【网络】TCP的长连接是如何实现的
TCP长连接是一种在网络通信中常见的技术,它可以有效地减少连接建立和关闭的开销,提高数据传输的效率,特别是在需要频繁通信的场景下。本文将介绍实现TCP长连接的方法和注意事项,帮助开发者更好地理解和应用这一技术。
TCP长连接的连接池、容量控制与心跳保活
想要简单,不追求高性能,使用短连接合适,这样我们就不需要操心连接状态的管理;想要追求性能,使用长连接,我们就需要担心各种问题:比如端对端连接的维护,连接的保活。
TCP长连接(KeepAlive)
转自:https://blog.csdn.net/chrisnotfound/article/details/80111559 1. TCP Keepalive的起源 TCP协议中有长连接和短连接之分。 短连接环境下,数据交互完毕后,主动释放连接; 长连接的环境下,进行一次数据交...
基于SpringBoot+Vue框架的电商应用系统的设计与实现(Java项目编程实战+完整源码+毕设文档+sql文件+学习练手好项目).zip
本电商应用系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此电商应用系统使用跨平台的可开发大型商业网站的HTML技术,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发,后台采用Java语言的Spring Boot框架,前台采用VUE框架和layui样式,电商应用系统实现页面基本用HTML文件写作方式。电商应用系统有管理员和用户两个角色。管理员功能有个人中心,管理员管理,公告类型管理,商品类型管理,论坛管理,积分记录管理,公告信息管理,商品信息管理,商品评价管理,商品收藏管理,商品订单管理,用户管理,轮播图管理。用户可以注册登录,查看和购买商品,对商品进行评价和收藏,在论坛发消息等操作。电商应用系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。关键词:电商应用系统;
291




被折叠的 条评论
为什么被折叠?



