高性能网络服务框架Mina
- 格式:docx
- 大小:14.47 KB
- 文档页数:5
Servlet,Tomcat,Jetty,Netty,Mina对⽐Servlet, Tomcat, Jetty, Netty,Mina结论先说结论吧: Servlet是⼀种Java EE规范,Tomcat & Jetty是Servlet容器,Tomcat包含了Servlet。
Servlet本⾝并不能处理外部请求,需要Servlet容器的配合,Netty和MINA是⽹络框架,我们可以使⽤Netty造出⾃⼰类似Tomcat的web服务器。
简单的关系的话 Tomcat = Jetty > Netty & MINA > Servlet。
Servletwiki上的定义:Servlet 是⽤ Java 编写的服务器端程序。
其主要功能在于交互式地浏览和修改数据,⽣成动态 Web 内容。
狭义的 Servlet 是指Java 语⾔实现的⼀个接⼝,⼴义的 Servlet 是指任何实现了这个 Servlet 接⼝的类,⼀般情况下,⼈们将 Servlet 理解为后者。
Tomcatwiki的定义:Tomcat 是由 Apache 软件基⾦会下属的 Jakarta 项⽬开发的⼀个 Servlet 容器,按照 Sun Microsystems 提供的技术规范,实现了对 Servlet 和 JavaServer Page(JSP)的⽀持,并提供了作为 Web 服务器的⼀些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 阀等。
由于 Tomcat 本⾝也内含了⼀个 HTTP 服务器,它也可以被视作⼀个单独的 Web 服务器。
但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是⼀个⽤C语⾔实现的 HTTPWeb服务器;这两个 HTTP web server 不是捆绑在⼀起的。
Apache Tomcat 包含了⼀个配置管理⼯具,也可以通过编辑XML格式的配置⽂件来进⾏配置。
5G SA的网络架构和关键技术5G SA是指基于5G独立组网(Standalone)的网络架构,与之相对应的是5G NSA (Non-Standalone)网络架构。
下面将介绍5G SA的网络架构和关键技术。
1. 网络架构:5G SA网络架构主要包括核心网、无线接入网与用户设备三个部分。
1.1 核心网:5G SA核心网的架构由5G核心网(5GC)和业务支持系统(Business Support System,BSS)组成。
5GC是5G SA核心网的关键组成部分,包括核心用户面、核心控制面和网络管理平面。
在核心用户面上,5GC提供了一系列的业务功能,例如用户识别、安全策略、会话管理等。
核心控制面负责用户数据的传输和路由,以及网络功能的控制和协调。
网络管理平面负责网络的配置、管理和监控。
1.2 无线接入网:5G SA的无线接入网包括5G基站和传输网络两部分。
5G基站负责与用户设备之间的无线通信,通过用户设备接入射频信号进行数据传输。
传输网络负责将用户设备传输的数据进行处理和转发,以保证数据的稳定性和可靠性。
1.3 用户设备:就像其他移动通信网络,5G SA网络中的用户设备包括手机、平板电脑、物联网设备等。
用户设备通过5G基站与核心网和其他用户设备进行通信。
2. 关键技术:2.1 新空口技术:为了实现更高的数据传输速率和更低的时延,5G SA引入了新的空口技术,如高增益多天线技术(Massive MIMO)、波束成形技术(Beamforming)和多路径接收技术等。
这些技术可以增加无线信号的覆盖范围和传输效率,提高网络的容量和性能。
2.2 网络切片:5G SA支持网络切片技术,将网络资源按照不同的业务需求进行划分和分配,可以为不同的应用场景提供定制化的网络服务。
网络切片可以提高网络的灵活性和可扩展性,支持各种不同类型的应用,如增强型移动宽带、物联网和车联网等。
2.3 蜂窝协同传输:5G SA引入了蜂窝协同传输技术,可以将多个基站的传输资源进行协同利用,提高网络的能源效率和容量。
Mina简单的⼊门⽰例Mina是Apache下的⼀个⽹络应⽤程序框架,⽤来帮助⽤户简单地开发⾼性能和⾼可扩展性的⽹络应⽤程序。
它提供了⼀个通过Java NIO在不同的传输协议上抽象的事件驱动的异步API,例如TCP/IP和UDP/IP。
还没了解原理之前,我们先从官⽹例⼦改写⼀下,从实践开始。
我记得⼊⾏前有个前辈说过,学习任何新技术,不要先急着了解其原理,先找个例⼦实践⼀下。
我觉得相当正确,因为没有谁在学习⾃⾏车前,是先把⾃⾏车运⾏原理弄清楚的。
依赖:jdk1.7开发环境:ideaIU-14.1.4测试环境:win7建⽴maven⼯程MinaDemo,在pom.xml配置⽂件添加必要的依赖:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<?xml version="1.0"encoding="UTF-8"?><project xmlns=""xmlns:xsi=""xsi:schemaLocation=" "><modelVersion>4.0.0</modelVersion><groupId>MinaDemo</groupId><artifactId>MinaDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId><version>2.0.9</version></dependency></dependencies></project>TimeServer.java类:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30package com.mangocool.mina;import java.io.IOException;import .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.prefixedstring.PrefixedStringCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;/*** Created by MANGOCOOL on 2015/10/20.*/public class TimeServer {private static final int PORT = 9123;public static void main(String[] args) throws IOException{// 创建服务监听器,6是IoProcessor的线程数IoAcceptor acceptor = new NioSocketAcceptor(6);// 增加⽇志过滤器acceptor.getFilterChain().addLast("logger", new LoggingFilter());// 增加编码过滤器,统⼀编码UTF-8acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8")))); // 设置服务端逻辑处理器acceptor.setHandler(new TimeServerHandler());30 31 32 33 34 35 36 37 38 39 acceptor.setHandler(new TimeServerHandler());// 设置读缓存⼤⼩acceptor.getSessionConfig().setReadBufferSize(2048);// 设置指定类型的空闲时间,空闲时间超过这个值将触发sessionIdle⽅法 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 绑定端⼝acceptor.bind(new InetSocketAddress(PORT));}}TimeServerHandler.java类:1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56package com.mangocool.mina;import java.util.Date;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;/*** Created by MANGOCOOL on 2015/10/20.*/public class TimeServerHandler implements IoHandler {@Overridepublic void exceptionCaught(IoSession session, Throwable throwable) throws Exception{throwable.printStackTrace();}@Overridepublic void messageReceived(IoSession session, Object message) throws Exception{String str = message.toString();System.out.println("server端接收到的消息:"+ str);if(str.trim().equalsIgnoreCase("exit")){session.close(true);return;}Date date = new Date();session.write(date.toString());}@Overridepublic void messageSent(IoSession session, Object message) throws Exception{System.out.println("server端发送信息:"+ message.toString());}public void inputClosed(IoSession session) throws Exception{System.out.println("server端:"+ session.getId() + " 关闭输⼊");}@Overridepublic void sessionClosed(IoSession session) throws Exception{System.out.println("server端IP:"+ session.getRemoteAddress().toString() + " 关闭连接"); System.exit(0);}@Overridepublic void sessionCreated(IoSession session) throws Exception{System.out.println("server端IP:"+ session.getRemoteAddress().toString() + " 创建连接"); }@Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 public void sessionIdle(IoSession session, IdleStatus status) throws Exception{System.out.println("server端闲置连接:会话 "+ session.getId() + " 被触发 "+ session.getIdleCount(status) + " 次"); }@Overridepublic void sessionOpened(IoSession session) throws Exception{System.out.println("server端打开连接");}}public void exceptionCaught(IoSession session, Throwable cause) 当接⼝中其他⽅法抛出异常未被捕获时触发此⽅法。
客户端通信过程1.通过SocketConnector同服务器端建立连接2.链接建立之后I/O的读写交给了I/O Processor线程,I/O Processor是多线程的3.通过I/O Processor读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议4.最后IoFilter将数据交给Handler进行业务处理,完成了整个读取的过程5.写入过程也是类似,只是刚好倒过来,通过IoSession.write写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过I/O Processor将数据写出到socket通道IoFilterChain作为消息过滤链1.读取的时候是从低级协议到高级协议的过程,一般来说从byte字节逐渐转换成业务对象的过程2.写入的时候一般是从业务对象到字节byte的过程IoSession贯穿整个通信过程的始终整个过程可以用一个图来表现消息箭头都是有NioProcessor-N线程发起调用,默认情况下也在NioProcessor-N线程中执行类图/class-diagrams.html#ClassDiagrams-ProtocolDeco derclassdiagramConnector作为连接客户端,SocketConector用来和服务器端建立连接,连接成功,创建IoProcessor Thread(不能超过指定的processorCount),Thread由指定的线程池进行管理,IoProcessor 利用NIO框架对IO进行处理,同时创建IoSession。
连接的建立是通过Nio的SocketChannel进行。
NioSocketConnector connector = new NioSocketConnector(processorCount); ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT));建立一个I/O通道Acceptor作为服务器端的连接接受者,SocketAcceptor用来监听端口,同客户端建立连接,连接建立之后的I/O操作全部交给IoProcessor进行处理IoAcceptor acceptor = new NioSocketAcceptor();acceptor.bind( new InetSocketAddress(PORT) );Protocol利用IoFilter,对消息进行解码和编码,如以下代码通过 MyProtocolEncoder 将java对象转成byte串,通过MyProtocalDecoder 将byte串恢复成java对象Java代码1.connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyProtocalFactory()));2.......3.public class MyProtocalFactory implements ProtocolCodecFactory{4. ProtocolEncoderAdapter encoder = new MyProtocolEncoder();5. ProtocolDecoder decoder = new MyProtocalDecoder() ;6. public ProtocolDecoder getDecoder(IoSession session) throws Exception {7. return decoder;8. }9. public ProtocolEncoder getEncoder(IoSession session) throws Exception {10. return encoder;11. }12.}13.......14.public class MyProtocalDecoder extends ProtocolDecoderAdapter{15.16. public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)17. throws Exception {18.19. int id = in.getInt();20. int len = in.getInt();21. byte[] dst = new byte[len];22.23. in.get(dst);24.25. String name = new String(dst,"GBK");26.27. Item item = new Item();28. item.setId(id);29. item.setName(name);30. out.write(item);31. }32.}33.......34.public class MyProtocolEncoder extends ProtocolEncoderAdapter {35.36. public void encode(IoSession session, Object message,37. ProtocolEncoderOutput out) throws Exception {38. Item item = (Item)message;39. int byteLen = 8 + item.getName().getBytes("GBK").length ;40. IoBuffer buf = IoBuffer.allocate(byteLen);41. buf.putInt(item.getId());42. buf.putInt(item.getName().getBytes("GBK").length);43. buf.put(item.getName().getBytes("GBK"));44. buf.flip();45. out.write(buf);46.47. }48.}handler具体处理事件,事件包括:sessionCreated、sessionOpened、sessionClosed、sessionIdle、exceptionCaught、messageReceived、messageSent。
学号:0928524059基于Mina框架的Java通讯层应用学院名称:软件学院专业名称:计算机科学与技术年级班别: 2009级Java班姓名:指导教师:教授2013年05月基于Mina框架的Java通讯层应用摘要Apache Mina Server是一个网络通信应用框架,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
随着网络通信的不断增加,用户对于服务器通讯层的要求也越来越高。
如何提高服务器端程序的性能,如何使用一种高效的I/O底层,从而更容易地开发出高性能的网络应用程序,成为近年来通讯层研究的主要课题。
通过对比,基于Mhm(Minimum hardware modificatio)框架的通讯层具有实现简单,性能高效的特点,是Java通讯层应用的推荐框架.关键词Mina;Java;Mhm;IO;NIO;Socket;ServerSocket; TCP/IP; IoAcceptor ;IoConnector; BufferedReader;Buffer;Charset;Channels;Selector;J2EE;MyEclipse;Enterprise ;JavaBeans; MinaServeBased on the the Mina Framework of Java Communication Layer ApplicationsAbstract Apache Mina Server is a network communication application framework, it is primarily a communication framework based on TCP / IP, UDP / IP protocol stack (of course, also can provide Java object serialization, the virtual machine pipe communication services), Mina canhelp us to quickly develop high-performance, highly scalable network communications applications, Mina provides event-driven, asynchronous (asynchronous IO Mina's default is to use programming model the Java NIO as the underlying support) operation. With the continuous increase in network traffic, users are increasingly high requirements for the server communication layer. Therefore, how to improve the performance of the server-side program, how to use a highly efficient I / O low-level, making it easier to develop a high-performance network applications become the main topic of the communication layer in recent years. Mhm (Minimum hardware modification ) framework-based communication layer has a simple, efficient performance, by contrast, is the the Java communication layer applications recommended framework.Keywords Mina;Java;Mhm;IO;NIO;Socket;ServerSocket;TCP/IP;IoAcceptor ;IoConnector;BufferedReader;Buffer;Charset;Channels;Selector;J2EE;MyEclipse;Enterprise ;JavaBeans;MinaServe。
5G SA的网络架构和关键技术随着5G标准的逐步成熟和商用,5G SA(独立组网)作为5G网络的一种重要架构,也受到了广泛的关注。
与NSA(非独立组网)相比,5G SA具有更高的灵活性和性能优势,能够为用户提供更加稳定和高速的网络体验。
本文将从网络架构和关键技术两个方面,探讨5G SA的特点和优势。
一、5G SA的网络架构5G SA的核心网络架构主要由AMF(核心网功能性网络节点)、SMF(会话管理功能网络节点)、UPF(用户面功能网络节点)、NRF(网络资源功能网络节点)等组成。
AMF负责用户身份管理和鉴权,SMF负责会话管理和策略控制,UPF负责用户数据的传输和处理,NRF负责网络资源的管理和分配。
这个核心网络架构的设计使得5G SA具有更加灵活和快速的网络部署能力,能够更好地适应不同业务场景和需求。
5G SA的无线接入网络架构采用了全新的RAN(无线接入网络)架构,主要由gNB(5G 基站)和NG-RAN(Next Generation RAN)组成。
gNB与NG-RAN之间采用了灵活的接口协议,能够实现更加高效的无线资源调度和管理。
5G SA的RAN架构还支持更多频段的组网和更高密度的接入用户,使得5G SA能够更好地应对移动宽带、物联网和工业互联网等多种业务需求。
二、5G SA的关键技术1. 网络切片技术网络切片是5G SA的重要技术之一,它能够将整个网络资源根据不同的业务需求和服务质量要求,进行灵活的划分和分配。
通过网络切片技术,5G SA能够为不同的用户和业务提供定制化的网络服务,满足不同的性能指标和服务级别。
这一技术的应用,使得5G SA能够更好地支持多样化的服务和应用场景,为用户提供更加优质的网络体验。
2. Massive MIMO技术Massive MIMO是5G SA的另一项关键技术,它通过大规模天线阵列和高效的信号处理算法,能够实现更加高效的空间频谱复用和波束赋形,提高了网络的覆盖范围和容量。
高性能网络服务框架 Mina
因为想做网络 flash 游戏(想开始做个简单的五子棋),希望可以高效的 开发,因为应用群不会超过并发 200 个点,所以性能不是优先考虑,同时又 恰好看到了 mina,故事从这里开始......
Mina 是个 apache 的一个子项, 它把 tcp udp pipe 等做了很好的封装, 同时我不考虑用 c 写是因为以后给别人不好维护,因为现在学 c 的人实在越 来越少了,但是需要性能的网络服务还真得用 C,又费话了一段,下面具体介 绍我刚了解的 Mina. 因为 adobe flash or flex 只支持 tcp client, 所以我测试了 Mina 的 tcp server 部分,看一段代码先
import java.io.IOException;
import .InetSocketAddress; import java.nio.charset.Charset; import mon.ByteBuffer; import mon.IoAcceptor; import mon.SimpleByteBufferAllocator;
import org.apache.mina.filter.LoggingFilter; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.SocketAcceptor; import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; public class test { /** * @param args */ private static final int PORT = 9000; public static void main(String[] args) throws IOException { ByteBuffer.setUseDirectBuffers(false);/*设置内存获取方式*/ ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); IoAcceptor acceptor = new SocketAcceptor();/*socket 接受
服务*/ acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler());/*bind tcp 的服务, 到这里有用的好像就两行 就搞定了,很简单,这样服务就起来了,呵呵*/ System.out.println("MINA Time server started."); } }
TimeServerHandler 这个部分是实现 tcp server 处理的部分,以下 描述:(为什么起这个名字,因为整个代码我通过网站快速向导做的,没有修 改,原来向导是实现了一个时间询问服务)
import java.util.Date;
import mon.IdleStatus; import mon.IoHandlerAdapter; import mon.IoSession; import mon.TransportType; import org.apache.mina.transport.socket.nio.SocketSessionConfig; import mon.ByteBuffer;
public class TimeServerHandler extends IoHandlerAdapter { /*当 tcp client 发生异常断开时触发*/ public void exceptionCaught(IoSession session, Throwable t) throws Exception { t.printStackTrace(); session.close(); } /*当有数据来时触发*/ public void messageReceived(IoSession session, Object msg) throws Exception { /*接受数据,并且打印成 hex*/ ByteBuffer get = (ByteBuffer)msg; System.out.println("Rec:" + get.getHexDump()); /*反馈数据,一个 a*/ ByteBuffer bb = ByteBuffer.allocate(10); bb.asCharBuffer().append('a'); session.write( bb);
System.out.println("Message written..."); } /*当连接建立时触发*/ public void sessionCreated(IoSession session) throws Exception { System.out.println("Session created..."); if( session.getTransportType() == TransportType.SOCKET ) ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 ); session.setIdleTime( IdleStatus.BOTH_IDLE, 10 ); } }
。