`
fly_hyp
  • 浏览: 305619 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

用mina写了一个Memcache服务端的通讯模拟程序

    博客分类:
  • Java
阅读更多
我用mina写了一个Memcache服务端的通讯模拟程序
使用的是 mina-core-2.0.0-M1.jar
一共3各类
HypTestServerHandler
MinaUtilRun 启动类
TimeServerHandler

欢迎和我交流着方面的问题。


public class TimeServerHandler extends IoHandlerAdapter {
	public void exceptionCaught(IoSession session, Throwable t)
			throws Exception { // 出现异常的时候调用.
		t.printStackTrace();
		session.close();
	}

	public void messageReceived(IoSession session, Object msg) throws Exception { // 接收客户端新的消息的时候调用.
		String str = msg.toString();
		if (str.trim().equalsIgnoreCase("quit")) {
			session.close();
			return;
		}

		Date date = new Date();
		session.write(date.toString());
		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);
	}
}


public class MinaUtilRun {
	
	private static final int PORT = 11211;

    public static void test() throws Exception {
    	
        ByteBuffer.setUseDirectBuffers(false);
        ByteBuffer.setAllocator(new SimpleByteBufferAllocator());

        IoAcceptor acceptor = new SocketAcceptor();

        SocketAcceptorConfig cfg = new SocketAcceptorConfig(); //创建一个与SocketAcceptor相关联的配置对象.
        cfg.getSessionConfig().setReuseAddress( true );
        cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
        cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new HypLineCodecFactory( Charset.forName( "GBK" ))));

        //acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);//绑定端口,处理对象和配置对象.
        acceptor.bind( new InetSocketAddress(PORT), new HypTestServerHandler(), cfg);//绑定端口,处理对象和配置对象.
        
        System.out.println("MINA Time server started.");
        
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			test();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


public class HypTestServerHandler extends IoHandlerAdapter {
	public void exceptionCaught(IoSession session, Throwable t)
			throws Exception { // 出现异常的时候调用.
		t.printStackTrace();
		session.close();
	}

	public void messageReceived(IoSession session, Object msg) throws Exception { // 接收客户端新的消息的时候调用.
		String stat = (String) session.getAttribute("stat");
		String str = msg.toString();
		JavaUtil.debugPrint("receive:" + str);
		if(stat.equals("GetCommand")){
			if(str.equals("version")){
				session.write("VERSION 1.2.2");
				JavaUtil.debugPrint("response verison .... VERSION 1.2.2");
				return;
			}	
			if(str.startsWith("set ")){
				String[] parts = str.split(" ");
				int dataSize = Integer.parseInt(parts[4]);
				JavaUtil.debugPrint("dataSize:" + dataSize);
				session.setAttribute("dataSize", dataSize);
				session.setAttribute("readSize", 0);
				session.setAttribute("stat", "readData");
				session.setAttribute("dataBuf", new StringBuilder());
				session.setAttribute("currentCmd", parts);
			}
		}else if(stat.equals("readData")){
			int dataSize = (Integer)session.getAttribute("dataSize");
			int readSize = (Integer)session.getAttribute("readSize");
			StringBuilder buf = (StringBuilder)session.getAttribute("dataBuf");
			if(buf.length() > 0){
				buf.append("\r\n");
			}
			buf.append(str);
			readSize += str.length() + 2;
			session.setAttribute("readSize", readSize);
			JavaUtil.debugPrint("read data:" + readSize + "/" +dataSize );
			if(readSize == dataSize){
				//处理命令
				String[] parts = (String[])session.getAttribute("currentCmd");				
				System.out.println("buf.length():" + buf.length());
				System.out.println(buf.toString());
				session.write("STORED");				
				session.setAttribute("stat", "GetCommand");
				}
		}
		
		
		
		
			
		

		//Date date = new Date();
		//session.write(date.toString());
		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);
		session.setAttribute("stat", "GetCommand");
	}
}



4
1
分享到:
评论
2 楼 fly_hyp 2010-01-03  
xianglei 写道
new HypLineCodecFactory( Charset.forName( "GBK" ))) HypLineCodecFactory这个类呢?

就是下面这些代码吧!
/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 *
 */
//这是从Mina的源代码摘过来的
package cn.sh.flyhyp.memcache.client.codec;

import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;

/**
 * A delimiter which is appended to the end of a text line, such as
 * <tt>CR/LF</tt>.
 *
 * @author The Apache MINA Project (dev@mina.apache.org)
 * @version $Rev: 714210 $, $Date: 2009-05-06 06:47:16 $
 */
public class LineDelimiter {
    /**
     * the line delimiter constant of the current O/S.
     */
    public static final LineDelimiter DEFAULT;

    static {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        PrintWriter out = new PrintWriter(bout);
        out.println();
        DEFAULT = new LineDelimiter(new String(bout.toByteArray()));
    }

    /**
     * A special line delimiter which is used for auto-detection of
     * EOL in {@link MemcachedDecoder}.  If this delimiter is used,
     * {@link MemcachedDecoder} will consider both  <tt>'\r'</tt> and
     * <tt>'\n'</tt> as a delimiter.
     */
    public static final LineDelimiter AUTO = new LineDelimiter("");

    /**
     * The CRLF line delimiter constant (<tt>"\r\n"</tt>)
     */
    public static final LineDelimiter CRLF = new LineDelimiter("\r\n");
        
    /**
     * The line delimiter constant of UNIX (<tt>"\n"</tt>)
     */
    public static final LineDelimiter UNIX = new LineDelimiter("\n");

    /**
     * The line delimiter constant of MS Windows/DOS (<tt>"\r\n"</tt>)
     */
    public static final LineDelimiter WINDOWS = CRLF;

    /**
     * The line delimiter constant of Mac OS (<tt>"\r"</tt>)
     */
    public static final LineDelimiter MAC = new LineDelimiter("\r");

    /**
     * The line delimiter constant for NUL-terminated text protocols
     * such as Flash XML socket (<tt>"\0"</tt>)
     */
    public static final LineDelimiter NUL = new LineDelimiter("\0");

    private final String value;

    /**
     * Creates a new line delimiter with the specified <tt>value</tt>.
     */
    public LineDelimiter(String value) {
        if (value == null) {
            throw new NullPointerException("delimiter");
        }
        this.value = value;
    }

    /**
     * Return the delimiter string.
     */
    public String getValue() {
        return value;
    }

    @Override
    public int hashCode() {
        return value.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof LineDelimiter)) {
            return false;
        }

        LineDelimiter that = (LineDelimiter) o;
        return this.value.equals(that.value);
    }

    @Override
    public String toString() {
        StringBuffer buf = new StringBuffer();
        buf.append("delimiter:");
        if (value.length() == 0) {
            buf.append(" auto");
        } else {
            for (int i = 0; i < value.length(); i++) {
                buf.append(" 0x");
                buf.append(Integer.toHexString(value.charAt(i)));
            }
        }
        return buf.toString();
    }
}

1 楼 xianglei 2010-01-03  
new HypLineCodecFactory( Charset.forName( "GBK" ))) HypLineCodecFactory这个类呢?

相关推荐

    Mina 服务端客户端示例程序

    Mina(MINA,全称Java Minimal Asynchronous Network Infrastructure)是一个高性能、轻量级的网络应用框架,由Apache软件基金会开发。它主要被用于构建基于TCP/IP和UDP/IP协议的应用,如HTTP服务器、FTP服务器、DNS...

    使用mina框架实现cmpp2.0服务端

    Mina(Java Minimal Asynchronous Network Library)是一个用Java编写的网络通信库,主要用于构建高性能、高可用性的网络服务器。它提供了一种简单而强大的API,用于处理TCP/IP和UDP/IP协议,以及SSL/TLS加密的网络...

    mina 长连接 客户端+服务端

    Mina 是一个强大的开源框架,主要用于构建网络应用,如服务器和客户端。在Java环境中,它提供了高效的、事件驱动的网络应用程序框架,支持TCP和UDP协议,适用于开发高性能、高并发的网络服务。在这个"mina 长连接 ...

    Mina开发实例(服务端、客户端)DEMO

    Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...

    android mina 即时通讯 服务端客户端代码

    在服务端,你需要创建一个基于Mina的SocketAcceptor,监听特定的端口(如描述中提到的"端口应该是对应好的")。服务端的核心类是`ServerBootstrap`,用于配置服务器的行为和绑定端口。启动服务端时,你可以运行`demo...

    mina2推送demo服务端

    标题中的“mina2推送demo服务端”指的是使用Apache Mina框架构建的一个推送服务端的示例项目。Apache Mina是一个开源的Java网络应用框架,它简化了开发高性能和高可用性的网络服务器和客户端应用程序的工作。Mina...

    MINA 服务端和客户端demo

    MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,提供了一套高度可扩展和高性能的网络应用程序框架,用于构建服务器和客户端应用。它简化了网络编程,特别是TCP/IP...

    apache mina-spring 服务端程序

    在这个"apache mina-spring 服务端程序"项目中,Mina和Spring被整合在一起,创建了一个高效的服务端程序。这样的整合允许开发者利用Spring的强大功能来管理服务端的生命周期,配置网络连接,以及处理业务逻辑。...

    mina server开发服务端/客户端代码

    在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接请求。Acceptor会处理连接建立、数据传输和连接关闭等网络事件。服务端的核心组件是IoHandler,它定义了对网络事件的处理方法,如...

    mina及时推送客户端服务端实现

    Apache MINA(Multi-purpose Infrastructure for Network Applications)是一个用于构建高性能、跨平台网络应用程序的Java框架。MINA 提供了一个高级的网络应用编程接口 (API),它抽象了底层的传输层,使得开发者...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    “服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)” 这个标题表明这是一个使用MINA2框架在服务端实现的UDP(User Datagram Protocol)双向通信的示例代码。MINA2是一个开源的Java网络应用程序框架,它简化了...

    mina2服务端客户端实例,保证能够正常运行

    标题中提到的"mina2服务端客户端实例"是指使用Apache MINA 2版本创建的一个工作示例,该示例包含了服务端和客户端的完整代码,旨在帮助开发者理解如何在实际项目中运用MINA进行网络通信。通过导入Eclipse这样的集成...

    mina框架中socket使用,有服务端和客户端。

    mina框架是Apache组织开发的一个网络通信框架,它基于Java NIO(非阻塞I/O)构建,用于简化网络编程,尤其是TCP和UDP协议的应用开发。本项目提供了服务端和客户端的示例,使得开发者能够更好地理解和应用MINA框架。 ...

    spring+mina实现http接口服务端通信客户端

    Spring 和 Mina 结合使用可以构建高性能的网络通信应用,而Spring MVC 是Spring 框架的一个模块,专门用于处理Web请求。在这个"spring+mina实现http接口服务端通信客户端"的项目中,我们将深入探讨如何整合这两个...

    一个源代码学习服务端 ,基于mina

    【标题】:“一个源代码学习服务端,基于Mina” Mina(JavaMinimal Asynchronous Network Library)是一个开源的网络通信框架,由Apache软件基金会维护。它提供了高度可扩展且低级别的网络应用程序接口,用于构建高...

    mina_tcp服务端需要jar包.zip

    mina_tcp服务端需要jar包.zip这个压缩包是针对Apache MINA框架实现TCP长连接服务端的一个资源集合。Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序...

    MINA客户端与服务端通信实例

    在IT行业中,网络通信是应用程序之间交互的基础,而MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用框架,主要用于构建服务器端应用程序。本实例将探讨如何...

    AndroidMina服务端和客户端的实现

    在服务端,Mina提供了一个Acceptor,它是监听特定端口并处理连接请求的对象。在创建Acceptor时,我们需要指定一个处理器,该处理器负责处理接收到的数据。在这个案例中,服务端可能创建了一个`MyProtocolDecoder`和`...

    mina mmorpg服务端源码

    "mina mmorpg服务端源码"是一个专注于游戏服务器端开发的项目,其核心技术是基于Apache Mina框架,并采用了AMF3编解码格式,这为高效的数据传输和游戏逻辑处理提供了坚实的基础。 Apache Mina是一个开源的网络通信...

    Android使用Mina与服务器通信Demo(包括服务端)

    **Android使用Mina与服务器通信Demo** Mina(Minimum Asynchronous Network)是一个高度可扩展的、高...对于初学者,这是一个很好的起点,通过阅读和运行代码,可以深入理解Mina在网络通信中的工作原理和使用方法。

Global site tag (gtag.js) - Google Analytics