`
lanxin1985
  • 浏览: 83218 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论

利用MINA传送对象,字符串(前后台代码)

阅读更多
利用MINA传送对象,字符串(前后台代码)

其中用到的第三方JAR包有两个,分别是mina-core-2.0.0-M5.jar和slf4j-nop-1.5.6.jar

NIO的优点。何时才使用。当你需要比较多的并发,而且并发的需要做长连接时,传统的连续池可能会满足不了你的需求,必竟如果连接池维护过多的连接时,对于虚拟机的要求比较高,但如果过少连接的话,阻塞的线程会让程序处理的非常慢,这时,你就可以考虑一下使用NIO框架MINA

下面是一个类似于HELLO WORLD的程序,相信熟悉SOCKET,看了马上就能上手MINA了。
客户端代码:


import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class MinaClient
{

private static int PORT=8991;
    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException
    {
        System.out.println("开始机器连续服务器");
        //创建TCP/IP的连接
        NioSocketConnector connector=new NioSocketConnector();
        //创建接收数据的过滤器
        DefaultIoFilterChainBuilder chain=connector.getFilterChain();
        /*
         * 这里注意点:
         * 1:TextLineCodecFactory设置这个过滤器一行一行(/r/n)的发送/读取数据
         * 2.ObjectSerializationCodecFactory一般发送/接收的是对象等形象,以对象形式读取
         */
        //chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));      
        chain.addLast("myChain",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
        Message msg=new Message("TObject");
        //设置处理的类
        connector.setHandler(new MinaClientClient(msg));
   //设置时间
        connector.setConnectTimeoutMillis(300000);
   //开始连接服务器
   ConnectFuture cf=connector.connect(new InetSocketAddress("localhost",PORT));
   //等待连接结束
        cf.awaitUninterruptibly();
        cf.getSession().getCloseFuture().awaitUninterruptibly();   
        connector.dispose();   
       
    }

}

客户端用MinaClientClient来处理发送的信息,MinaClientClient类必须继承IoHandlerAdapter,类似于Struts中处理action的类必须继承Action


import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class MinaClientClient extends IoHandlerAdapter
{

    public MinaClientClient()
    {
    }
   
    private Object msg;
    public MinaClientClient(Object message)
    {
    this.msg=message;
    }
   
   
    @Override
    public void sessionOpened(IoSession session) throws Exception
    {
        System.out.println("我来了..");
        session.write(msg);
       
    }
   
    @Override
    public void sessionClosed(IoSession arg0) throws Exception
    {
        System.out.println("我走喽");
    }
   
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception
    {
    Message msg=(Message)message;
    System.out.println("处理完的结果为"+msg.getMsgBody());
   
    }
   
    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
    //session.write(strC);
    // TODO Auto-generated method stub
    //super.messageSent(session, message);
    }
   
    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
       throws Exception {
    cause.printStackTrace();
    session.close(true);
    }
   
}

服务端代码:

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChain;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MainServer
{
    //设置端口
    public static int PORT=8991;
   
    /**
     * @param args
     * @throws IOException
     * @author jqh
     */
    public static void main(String[] args) throws IOException
    {
    System.out.println("服务创建中");
        //创建一个非阻塞的的server端socket,用NIO  
        SocketAcceptor acceptor=new NioSocketAcceptor();
       
        //创建接收数据的过滤器
        DefaultIoFilterChainBuilder chain=acceptor.getFilterChain();
       
        /*
         * 这里注意点:
         * 1:TextLineCodecFactory设置这个过滤器一行一行(/r/n)的读取数据
         * 2.ObjectSerializationCodecFactory一般接收的是对象等形象,以对象形式读取
         */
        //chain.addLast("chain", new ProtocolCodecFilter(new TextLineCodecFactory()));
        chain.addLast("chain", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
        //设定服务器端消息处理器.:就是我们创建的TimeServerHandler对象
        acceptor.setHandler(new TimeServerHandler());
       
        acceptor.bind(new InetSocketAddress(PORT));
       
        System.out.println("MINS 服务器监听的服务端口为"+PORT);
       
    }

}

类似于客户端,用于处理客户端请求的类为TimeServerHandler

import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

import com.dzkj.socketserver.minaclient.Message;

public class TimeServerHandler extends IoHandlerAdapter
{
    /****
     * session打开时,调用
     */
    @Override
    public void sessionOpened(IoSession session) throws Exception
    {
        System.out.println("incoming client ..."+session.getRemoteAddress());
       
    }
    /***
     * 连接关才时调用
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception
    {
        System.out.println("client close...........");
    }
    /**
     * 如果出异常,就关闭session
     */
    @Override
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
    {
        cause.printStackTrace();
        session.close(true);
    }
   
    /**
     * 收到客户端信息时调用
     */
    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {
    System.out.println("in messageReceived");        
        Message msg = (Message) message;
        System.out.println("begin send msg: " + msg.getMsgBody());
        msg.setMsgBody("change it "+msg.getMsgBody());
        session.write(msg);
        System.out.println("Message written...");
    }
    /***
     * 空闲时调用
     */
    @Override
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
    {
        System.out.println( "IDLE " + session.getIdleCount( status ));
    }
}


对象类:

import java.io.Serializable;

public class Message implements Serializable {

    private String msgBody;
   
    public Message(String msgBody)
    {
        this.msgBody = msgBody;
    }

    public String getMsgBody() {
        return msgBody;
    }

    public void setMsgBody(String msgBody) {
        this.msgBody = msgBody;
    }
}

先运行服务器---

再运行客户端.可得到结果:

客户端控制台:
开始机器连续服务器
我来了..
处理完的结果为change it TObject
我走喽

服务端控制台:
服务创建中
MINS 服务器监听的服务端口为8991
incoming client .../127.0.0.1:4685
in messageReceived
begin send msg: TObject
Message written...
client close...........

当然,服务端会一直监听8991端口。有客户端请求就会做处理,还有发送String对象就不写详细代码了。主要区别就是上面注释提到的部分要改一下,然后直接写String过去即可。
还有要注意的是,传送Object时,对象一定要实现Serializable。反序例化一般比较严谨的操作。别忘了

分享到:
评论

相关推荐

    Mina文件及字符串传输

    标签中的"Mina 文件 字符串 传输 传送"进一步强调了Mina在处理文件和字符串数据传输时的角色。通过Mina,开发者可以构建出稳定、高效的网络应用,无论是简单的字符串交流还是复杂的文件传输,都能轻松应对。 总的来...

    spring boot 整合mina 串口

    这个例子中,我们创建了一个可直接运行的Spring Boot项目,通过配置文件指定串口参数,然后利用Mina进行串口通信。注意,实际应用中需要根据具体需求调整配置和处理逻辑。希望这个例子能帮助你节省时间,避免在整合...

    mina传输对象的示例

    Apache Mina是一个开源的Java框架,主要用于简化网络应用开发,特别是TCP/IP和UDP协议的应用。在标题和描述中提到的“mina...通过理解和实践“mina传输对象的示例”,你可以更好地掌握如何在实际项目中利用Mina框架。

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    在Mina中,我们可以利用BufferedIoFilter或者IoBuffer来传输文件,包括图片。首先,我们需要将图片文件读取到内存中的IoBuffer,然后通过过滤器链传递给远程客户端。在这个过程中,可以实现数据压缩、加密等额外...

    springboot mina 串口对接

    在SpringBoot集成Mina的场景下,我们可以利用Mina提供的API来读写串口数据,实现设备间的双向通信。 "Mina"框架是Apache组织开发的一个网络通信库,它提供了一套高级抽象层,允许开发者使用类似Java NIO的API进行...

    mina客户端简单代码示例

    标题中的"mina客户端简单代码示例"意味着我们将探讨如何使用Mina框架编写一个基础的客户端程序,该程序能够连接到服务器并发送数据。描述指出,运行这个客户端程序(minaTestClient)会展示一个窗口,用户可以通过...

    mina源代码学习提供下载

    通过阅读和分析MINA的源代码,你可以更深入地了解其内部工作原理,学习如何利用MINA构建高性能的网络服务。这包括但不限于理解过滤器链的执行流程、如何自定义协议解析器以及如何优化MINA的配置以适应不同场景的需求...

    使用MINA进行UDP通信实现数据导入

    工作中的一个小项目,分享给大家参考,望大家不吝批评指教,本人常年从事JAVA软件开发,有丰富的MINA通信软件开发经验,现在已经有成熟的底层框架(结合了反射、DynaBean、Spring等多种技术),可以实现程序自动对...

    Mina Socket 源代码

    **Mina Socket 源代码解析** Mina Socket 是 Apache Mina 项目的一部分,它是一个高性能、可扩展的网络通信框架。Mina 提供了一种简单的方式来构建网络应用,如服务器和客户端,支持多种协议,如 TCP/IP 和 UDP。在...

    apache-mina-2.0.16-jar包-代码.zip

    标题中的"apache-mina-2.0.16-jar包-代码.zip"表明这是一个包含Apache Mina 2.0.16版本源代码的JAR文件压缩包。这个压缩包通常用于开发者进行源码级别的学习、调试或定制工作。通过解压这个文件,你可以获得Mina库的...

    longshine-Mina.NET-masterTCPUDP串口开发

    longshine-Mina.NET-masterTCPUDP串口开发longshine-Mina.NET-masterTCPUDP串口开发

    mina文件传输

    在"Mina文件及字符串传输"这个场景中,我们可以理解为利用Mina框架实现了一种服务,允许客户端通过发送字符串请求来获取服务器上的文件。这种功能在分布式系统、文件共享或者远程操作等场景中非常常见。下面我们将...

    利用Mina进行TCP通信

    本文将深入探讨如何利用Mina实现服务端和客户端的TCP通信,并结合JavaDemo1这一示例代码进行详细解析。 首先,理解Mina的基本概念。Mina提供了一种简化网络编程的抽象层,使得开发者可以专注于业务逻辑,而不是底层...

    mina2.0.3源代码

    此外,MINA还支持缓冲区对象的复用,进一步降低了内存分配和垃圾回收的负担。 7. **可扩展性**: MINA的架构允许开发者轻松添加新的传输类型或自定义协议。通过继承或实现MINA提供的接口,可以创建自己的传输层或...

    Apache mina源代码框架解析

    `TextLineCodecFactory`依赖于指定的字符集(这里是UTF-8),将输入的字符串转换为字节流,反之亦然。 `acceptor.setHandler(new TimeServerHandler())`定义了处理客户端连接的处理器,即`TimeServerHandler`。...

    Mina2.0.7原代码,去掉slf4j代码

    在"MINA 2.0.7原代码,去掉slf4j代码"这个项目中,我们可以看到Mina的核心组件mina_core_2.0.7已经被剥离了对SLF4J(Simple Logging Facade for Java)的日志抽象层的依赖。 SLF4J是一个为各种Java日志框架提供一个...

    ApacheMINA传递对象实例[借鉴].pdf

    在Apache MINA中传递对象,主要依赖于Java的序列化机制。在这个例子中,`MyRequestObject`和`MyResponseObject`是两个简单的Java对象,它们都实现了`Serializable`接口。这使得这些对象能够被转换为字节流在网络中...

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

    《Android Mina即时通讯:服务端与客户端代码详解》 在移动应用开发中,即时通讯功能已经成为不可或缺的一部分,尤其在社交应用中更是如此。本文将深入探讨如何利用Apache Mina框架在Android平台上实现即时通讯...

    apache-mina-2.0.4.rar_apache mina_mina

    这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的理想资源。 Apache Mina的核心理念是提供一个简洁的API,使得开发者能够专注于业务逻辑,而不是网络通信的底层...

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

    本压缩包包含的是使用Mina Server开发的服务端和客户端的源代码示例,非常适合初学者和有经验的开发者用来学习和参考。 服务端开发: 在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接...

Global site tag (gtag.js) - Google Analytics