`
leiyucd
  • 浏览: 1012 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

mina处理速度问题

阅读更多
我用mina写了一个短信处理器,在本机上测试很快。但是把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();
		}
	}

}

分享到:
评论

相关推荐

    MINA开发手册和JAR包

    5. **示例代码**:通过实例代码展示MINA如何处理常见的网络通信问题。 **JAR包**: 压缩包中的`mina`目录包含了MINA服务端的所有JAR包。这些库文件是MINA运行的必备组件,包括核心库、IO处理库、以及可能的依赖库。...

    Mina-1.1.7.jar

    《Mina-1.1.7.jar:Java服务器开源框架的异步...它通过异步并发的处理方式,降低了服务器并发编程的复杂性,提高了服务的性能和响应速度。对于Java开发者来说,理解并掌握Mina框架,将有助于构建高效、稳定的网络应用。

    Android-MinaSocket一款基于Mina的Socket长连接库

    2. **事件驱动**:Mina使用事件驱动模型,当数据到达或发送时,会触发相应的事件,这样可以减少不必要的等待,提高系统响应速度。 3. **协议无关性**:Mina库允许开发者轻松实现自定义协议,只需关注业务逻辑,而...

    MINA1.7包(源码)

    5. **缓冲区管理**:MINA提供了高效的数据缓冲区管理机制,能够减少数据拷贝,提高数据处理速度。 6. **编码解码器**:MINA提供了多种编码解码器,如LineDelimiterDecoder用于按行解码,ProtobufDecoder用于...

    MINA 2.0.0-M6

    1. 性能提升:MINA团队可能对框架的内部进行了优化,提高了处理速度和响应时间,降低了内存占用。 2. API调整:新版本可能对用户接口进行了调整,使其更加友好,或者添加了新的API来支持更复杂的操作。 3. 新的过滤...

    mina-core-2.0.1.jar,apache-mina-2.0.1

    1. **性能优化**:在 2.0.1 版本中,MINA 进行了多方面的性能提升,包括更快的数据传输速度和更低的内存消耗。 2. **更好的API设计**:此版本可能包含 API 的改进,使得开发者更容易理解和使用 MINA 框架。 3. **新...

    mina-2.0.4 source code

    在MINA中,所有的网络通信操作都通过事件驱动和异步回调的方式来完成,这使得MINA在处理大量并发连接时表现优异。 1. **非阻塞I/O(NIO)原理**: 非阻塞I/O与传统的阻塞I/O最大的区别在于,当数据不可读写时,...

    mina demo全套

    同时,你需要掌握Filter Chain的概念,这是Mina处理网络事件的关键机制,通过过滤器链,你可以添加自定义的逻辑来处理输入和输出数据。 此外,编码器和解码器(Encoder和Decoder)是Mina处理不同协议数据格式的重要...

    Socket及Mina的讲解

    Mina的异步模型可以更好地适应移动网络的不稳定特性,减少资源消耗,提高服务的稳定性和响应速度。 使用Mina构建推送服务时,开发者可以创建一个服务器端应用,监听特定端口,当收到新的推送消息时,通过过滤器链...

    socket mina测试框架

    - 在测试过程中,Mina框架会帮助捕获和处理网络通信中的异常,同时结合日志系统,记录关键信息,方便后期分析问题和优化。 9. **可扩展性**: - Mina测试框架允许自定义过滤器和处理器,方便扩展新的功能或适配...

    mina-core-2.0.0-M1

    标题"mina-core-2.0.0-M1"指的是Apache MINA的核心库的一个版本,这个版本是2.0.0的预发布版,标记为M1,意味着这是一个早期的里程碑版本,可能包含了新特性和改进,但可能还存在一些未解决的问题。 在开发Apache ...

    Mina测试的demo

    计数器可以记录成功连接的数量、发送和接收的数据包数量,甚至处理速度等指标。这些数据对于分析系统的吞吐量、延迟和稳定性至关重要。例如,我们可以在`MyHandler`中增加计数器,每当有数据交换时,就更新相应的...

    apache-mina-2.0.8

    5. **多线程与线程池**:MINA内部使用了线程池来处理网络事件,可以根据需求配置线程池大小,以平衡资源消耗和响应速度。 6. **缓冲区(Buffer)操作**:MINA提供了自己的缓冲区类,可以高效地处理字节流。缓冲区...

    mina和protobuf整合教程

    1. 高效数据序列化:Protocol Buffers序列化后的数据占用空间小,解析速度快,与MINA结合可以提升网络传输效率。 2. 易于维护:通过定义.proto文件,数据结构的变化不会影响到网络通信代码,降低了维护成本。 3. 跨...

    队列,mina通信的结合实例

    2. **异步处理**:MINA的异步I/O特性与队列相结合,可以将网络接收的数据放入队列,由后台线程进行处理,提高系统响应速度。 3. **顺序处理**:对于需要按顺序处理的数据,可以使用队列来保证处理顺序,例如在执行...

    mina 2.0.4

    10. **性能优化**:MINA 2.0.4版本可能包含性能优化,如减少内存分配,提高处理速度,以及对多核CPU的更好利用。 在学习MINA 2.0.4时,首先需要理解上述核心概念,然后通过阅读源代码,分析其内部实现,熟悉过滤器...

    Android2.2配合Mina时,出现的问题及完美解决方案

    Mina处理大量并发连接时,可能会导致内存溢出。在Android 2.2有限的内存环境中,这个问题尤为突出。优化策略包括:减少缓冲区大小,使用更高效的序列化和反序列化方法,及时释放不再使用的对象,以及调整Android的...

    Mina 2.0.0包

    4. **性能优化**:Mina 2.0.0版本可能对性能进行了优化,包括更快的数据处理速度、更低的内存消耗等,以满足大规模并发的需求。 5. **多线程和线程池**:Mina利用Java的多线程特性,通过线程池管理网络事件的处理,...

    mina 多路分离解码

    在mina框架中,“多路分离解码”(Multiplexing Decoding)是一个关键特性,它允许mina处理多个并发连接,并对每个连接的数据进行独立的解码处理,极大地提升了服务端的并发处理能力。 首先,我们需要理解“多路...

Global site tag (gtag.js) - Google Analytics