我用mina写了一个短信处理器,在本机上测试很快。但是把server和client放在局域网类的两台电脑上。处理速度很慢。不知道这是什么原因。是不是那里没有设置对,请各位支点招吧
下面是一部分代码:
server:
client:
程序入口方法
下面是一部分代码:
server:
package com.appgateway.networkcore.messageprocess; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; import com.appgateway.appinterface.GeneralMethod_HashMap; import com.appgateway.clientprocess.ExecuteConnectSmapp; import com.appgateway.coreprocess.AreaInfoLoad; import com.appgateway.coreprocess.SchoolInfoLoad; import com.appgateway.util.Constants; import com.cdqidi.appgateway.infoload.base.AreaInfoBean; import com.cdqidi.appgateway.infoload.base.DataCore; import com.cdqidi.appgateway.infoload.base.Message; import com.cdqidi.appgateway.infoload.base.SchoolInfoBean; import SoftFan.Log.wf_Log; public class MessageProcessServer extends IoHandlerAdapter { private NioSocketAcceptor nsa; /** * 启动数据监听服务 */ public void startup() { try { nsa = new NioSocketAcceptor(); DefaultIoFilterChainBuilder dfc = (DefaultIoFilterChainBuilder) nsa.getFilterChainBuilder(); dfc.addLast("ObjectData", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); dfc.addLast("ThreadPool", new ExecutorFilter(Executors.newCachedThreadPool())); nsa.setHandler(this); nsa.bind(new InetSocketAddress(8899)); wf_Log.sys_log("短信通道信息处理端服务监听器已开启......"); } catch (IOException e) { e.printStackTrace(); } } /** * 关闭数据监听服务 */ public void shutdown() { nsa.dispose(); wf_Log.sys_log("短信通道信息处理端服务监听器已关闭......"); } public void messageReceived(IoSession session, Object message) throws Exception { DataCore bean = (DataCore)message; wf_Log.sys_log("received current operation code【"+bean.getOpcode()+"】......"); this.subFunction(bean.getOpcode(),bean,session); //返回一个状态给客户端,告诉客户端,数据已接收。 session.write(1); wf_Log.sys_log("return the state to the client successfull......"); } private void subFunction(int operationCode, DataCore datacore,IoSession session) { switch (operationCode) { /** * edit the info of area. */ case Constants.area_edit: { AreaInfoBean areabean = (AreaInfoBean) datacore.getData(); AreaInfoLoad.getInstance().editParameter(((GeneralMethod_HashMap) areabean).getMap(),areabean.getAreaCode(), areabean.getAreaName()); break; } /** * add new value into the memory */ case Constants.area_insert: { AreaInfoBean areabean = (AreaInfoBean) datacore.getData(); AreaInfoLoad.getInstance().addParameter(((GeneralMethod_HashMap) areabean).getMap(),areabean.getAreaCode(), areabean.getAreaName()); break; } case Constants.area_singledelete: { AreaInfoBean areabean = (AreaInfoBean) datacore.getData(); AreaInfoLoad.getInstance().removeSingle(((GeneralMethod_HashMap) areabean).getMap(),areabean.getAreaCode()); break; } case Constants.area_removeall: { AreaInfoBean areabean = (AreaInfoBean) datacore.getData(); AreaInfoLoad.getInstance().removeAll(((GeneralMethod_HashMap) areabean).getMap()); break; } /** * 学校信息加载处理 */ case Constants.school_edit: { //SchoolInfoBean schoolinfobean = (SchoolInfoBean) datacore.getData(); //String value = schoolinfobean.getSchoolCode(); //SchoolInfoLoad.editParameter(SchoolInfoLoad.getMap(), value, value, value); break; } case Constants.school_singledelete:{ SchoolInfoBean sclbean = (SchoolInfoBean)datacore.getData(); System.out.println(sclbean.getSchoolCode()); SchoolInfoLoad.removeSingle(SchoolInfoLoad.getMap(), sclbean.getSysSchoolId()); break; } case Constants.school_insert:{ SchoolInfoBean sclbean = (SchoolInfoBean)datacore.getData(); String value = sclbean.getAreaID()+","+sclbean.getSchoolName()+","+sclbean.getSchoolSign(); SchoolInfoLoad.addParameter(SchoolInfoLoad.getMap(), sclbean.getSchoolCode(), value); break; } /** * update school information by xxt and adc */ case Constants.school_xxt_synchronous:{ break; } //短信发送 case Constants.MESSSAGE_SEND:{ ExecuteConnectSmapp.Do((Message) datacore.getData()); break; } } } }
client:
package org.cdqidi.sminterface.socket; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Properties; import java.util.concurrent.Executors; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.transport.socket.SocketConnector; import org.apache.mina.transport.socket.nio.NioSocketConnector; import SoftFan.Log.wf_Log; /** * 此类完成客户端与服务端的连接 * 需完成网络中断后自动重连 * @author jacklei * */ public class DataTansferService extends Thread{ /** * */ private static final long serialVersionUID = 1L; private static SocketConnector socket; private final static Properties properties = new Properties(); public static HashMap<Integer,ConnectFuture> _connect = new HashMap<Integer,ConnectFuture>(); private static ConnectFuture socketConnect(){ socket = new NioSocketConnector(); /** * 加载配置文件 */ load(); socket.getFilterChain().addLast("ObjectData", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); socket.getFilterChain().addLast("ThreadPool", new ExecutorFilter(Executors.newCachedThreadPool())); socket.setHandler(new ClientHandler()); ConnectFuture future =socket.connect(new InetSocketAddress(properties.getProperty("server_ip"), Integer.parseInt(properties.getProperty("server_port")))); future.awaitUninterruptibly(); return future; } public void run() { int key = 0; ConnectFuture _socketConnect = socketConnect(); while(true){ boolean socketConnect = _socketConnect.isConnected(); if(socketConnect){ try { _connect.put(key, _socketConnect); Thread.sleep(10000); wf_Log.sys_log("网络成功连接,10秒后,重新检测"); wf_Log.sys_log("CurrentSize:"+_connect.size()); } catch (InterruptedException e) { e.printStackTrace(); } }else{ wf_Log.sys_log("客户端未成功连接到服务器上,每隔3秒重新与服务器连接!"); try { Thread.sleep(3000); _socketConnect=socketConnect(); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 加载网络配置文件 */ private static void load(){ try { properties.load(new FileInputStream(new File("").getAbsolutePath().concat("\\config\\config.properties"))); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void startup(){ this.start(); } public void shutdown(){ this.interrupt(); this.close(); } /** * 关闭socket通道 */ private void close(){ if(socket.isActive()){ socket.dispose(); } } }
程序入口方法
package org.cdqidi.sminterface.socket; import java.io.IOException; import org.apache.mina.core.session.IoSession; import com.cdqidi.appgateway.infoload.base.DataCore; import com.cdqidi.appgateway.infoload.base.Message; public class test { /** * @param args */ public static void main(String[] args) { DataTansferService s = new DataTansferService(); s.start(); DataCore data = new DataCore(); Message msg = new Message(); msg.setMOBILES("13981739425"); msg.setCONTENT("我爱你MINA"); msg.setSCHOOL_ID("5001"); msg.setExescheck_code("01"); msg.setFunction_id("7"); data.setOpcode(99); data.setData(msg); try { Thread.sleep(5000); IoSession session = MessageSender.getSession(); System.out.println(session.isConnected()); if(session.isConnected()){ try { long start = System.currentTimeMillis(); for(int i =0;i<1000;i++) MessageSender.send(data,session); System.out.println(System.currentTimeMillis()-start); } catch (IOException e) { e.printStackTrace(); } } } catch (InterruptedException e) { e.printStackTrace(); } } }
相关推荐
5. **示例代码**:通过实例代码展示MINA如何处理常见的网络通信问题。 **JAR包**: 压缩包中的`mina`目录包含了MINA服务端的所有JAR包。这些库文件是MINA运行的必备组件,包括核心库、IO处理库、以及可能的依赖库。...
《Mina-1.1.7.jar:Java服务器开源框架的异步...它通过异步并发的处理方式,降低了服务器并发编程的复杂性,提高了服务的性能和响应速度。对于Java开发者来说,理解并掌握Mina框架,将有助于构建高效、稳定的网络应用。
2. **事件驱动**:Mina使用事件驱动模型,当数据到达或发送时,会触发相应的事件,这样可以减少不必要的等待,提高系统响应速度。 3. **协议无关性**:Mina库允许开发者轻松实现自定义协议,只需关注业务逻辑,而...
5. **缓冲区管理**:MINA提供了高效的数据缓冲区管理机制,能够减少数据拷贝,提高数据处理速度。 6. **编码解码器**:MINA提供了多种编码解码器,如LineDelimiterDecoder用于按行解码,ProtobufDecoder用于...
1. 性能提升:MINA团队可能对框架的内部进行了优化,提高了处理速度和响应时间,降低了内存占用。 2. API调整:新版本可能对用户接口进行了调整,使其更加友好,或者添加了新的API来支持更复杂的操作。 3. 新的过滤...
1. **性能优化**:在 2.0.1 版本中,MINA 进行了多方面的性能提升,包括更快的数据传输速度和更低的内存消耗。 2. **更好的API设计**:此版本可能包含 API 的改进,使得开发者更容易理解和使用 MINA 框架。 3. **新...
在MINA中,所有的网络通信操作都通过事件驱动和异步回调的方式来完成,这使得MINA在处理大量并发连接时表现优异。 1. **非阻塞I/O(NIO)原理**: 非阻塞I/O与传统的阻塞I/O最大的区别在于,当数据不可读写时,...
同时,你需要掌握Filter Chain的概念,这是Mina处理网络事件的关键机制,通过过滤器链,你可以添加自定义的逻辑来处理输入和输出数据。 此外,编码器和解码器(Encoder和Decoder)是Mina处理不同协议数据格式的重要...
Mina的异步模型可以更好地适应移动网络的不稳定特性,减少资源消耗,提高服务的稳定性和响应速度。 使用Mina构建推送服务时,开发者可以创建一个服务器端应用,监听特定端口,当收到新的推送消息时,通过过滤器链...
- 在测试过程中,Mina框架会帮助捕获和处理网络通信中的异常,同时结合日志系统,记录关键信息,方便后期分析问题和优化。 9. **可扩展性**: - Mina测试框架允许自定义过滤器和处理器,方便扩展新的功能或适配...
计数器可以记录成功连接的数量、发送和接收的数据包数量,甚至处理速度等指标。这些数据对于分析系统的吞吐量、延迟和稳定性至关重要。例如,我们可以在`MyHandler`中增加计数器,每当有数据交换时,就更新相应的...
5. **多线程与线程池**:MINA内部使用了线程池来处理网络事件,可以根据需求配置线程池大小,以平衡资源消耗和响应速度。 6. **缓冲区(Buffer)操作**:MINA提供了自己的缓冲区类,可以高效地处理字节流。缓冲区...
1. 高效数据序列化:Protocol Buffers序列化后的数据占用空间小,解析速度快,与MINA结合可以提升网络传输效率。 2. 易于维护:通过定义.proto文件,数据结构的变化不会影响到网络通信代码,降低了维护成本。 3. 跨...
标题"mina-core-2.0.0-M1"指的是Apache MINA的核心库的一个版本,这个版本是2.0.0的预发布版,标记为M1,意味着这是一个早期的里程碑版本,可能包含了新特性和改进,但可能还存在一些未解决的问题。 在开发Apache ...
2. **异步处理**:MINA的异步I/O特性与队列相结合,可以将网络接收的数据放入队列,由后台线程进行处理,提高系统响应速度。 3. **顺序处理**:对于需要按顺序处理的数据,可以使用队列来保证处理顺序,例如在执行...
10. **性能优化**:MINA 2.0.4版本可能包含性能优化,如减少内存分配,提高处理速度,以及对多核CPU的更好利用。 在学习MINA 2.0.4时,首先需要理解上述核心概念,然后通过阅读源代码,分析其内部实现,熟悉过滤器...
Mina处理大量并发连接时,可能会导致内存溢出。在Android 2.2有限的内存环境中,这个问题尤为突出。优化策略包括:减少缓冲区大小,使用更高效的序列化和反序列化方法,及时释放不再使用的对象,以及调整Android的...
4. **性能优化**:Mina 2.0.0版本可能对性能进行了优化,包括更快的数据处理速度、更低的内存消耗等,以满足大规模并发的需求。 5. **多线程和线程池**:Mina利用Java的多线程特性,通过线程池管理网络事件的处理,...
在mina框架中,“多路分离解码”(Multiplexing Decoding)是一个关键特性,它允许mina处理多个并发连接,并对每个连接的数据进行独立的解码处理,极大地提升了服务端的并发处理能力。 首先,我们需要理解“多路...