Mina传递对象

利用Apache MINA来传递对象,这对了MINA来说非常容易,并且这也是Java网络编程中很常用的应用。

首先看两个用来传递的Java对象MyRequestObject和MyResponseObject,很简单只是实现了Serializable接口罢了。

MyRequestObject.java

package demo5.vo;

import java.io.Serializable;

public class MyRequestObject implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    private String value;

    public MyRequestObject(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("Request [name: " + name  + ", value: " + value + "]");
        return sb.toString();
    }
}

MyResponseObject.java

package demo5.vo;

import java.io.Serializable;

public class MyResponseObject implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    private String value;

    public MyResponseObject(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("Response [name: " + name  + ", value: " + value + "]");
        return sb.toString();
    }
}

Server端的代码

MyServer.java

package demo5.server;

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

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.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyServer {

    private static final Logger logger = LoggerFactory.getLogger(MyServer.class);

    public static void main(String[] args) {
        int bindPort = 10000;

        IoAcceptor acceptor = new NioSocketAcceptor();

        //调用IoSessionConfig设置读取数据的缓冲区大小、读写通道均在10秒内无任何操作就进入空闲状态
        acceptor.getSessionConfig().setReadBufferSize(2048);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

        acceptor.setHandler(new MyServerHandler());

        try {
            acceptor.bind(new InetSocketAddress(bindPort));
        } catch (IOException ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
}

MyServerHandler.java

package demo5.server;

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

import demo5.vo.MyRequestObject;
import demo5.vo.MyResponseObject;

public class MyServerHandler extends IoHandlerAdapter{
    private static final Logger logger = LoggerFactory.getLogger(MyServerHandler.class);

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("IP:"+session.getRemoteAddress().toString());
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("IP:"+session.getRemoteAddress().toString()+"断开连接");
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        System.out.println( "IDLE " + session.getIdleCount( status ));
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        logger.error(cause.getMessage(), cause);
        session.close(true);
    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        logger.info("Received " + message);
        MyRequestObject myReqOjb = (MyRequestObject) message;
        MyResponseObject myResObj = new MyResponseObject(myReqOjb.getName(), myReqOjb.getValue());
        session.write(myResObj);
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        logger.info("Sent " + message);
    }

}

Client端代码:

MyClient.java

package demo5.client;

import java.net.InetSocketAddress;

import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
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.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClient {

    private static final Logger logger = LoggerFactory.getLogger(MyClient.class);

    public static void main(String[] args) {
        int bindPort = 10000;
        String ip="localhost";

        IoConnector connector = new NioSocketConnector();
        connector.setConnectTimeoutMillis(10 * 1000);

        connector.getFilterChain().addLast("logger", new LoggingFilter());
        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

        connector.setHandler(new MyClientHandler());

        IoSession session = null;
        try {
            ConnectFuture future = connector.connect(new InetSocketAddress(ip, bindPort));
            future.awaitUninterruptibly();
            session = future.getSession();
        } catch (RuntimeIoException e) {
            logger.error(e.getMessage(), e);
        }

        session.getCloseFuture().awaitUninterruptibly();
        connector.dispose();
    }
}

MyClientHandler.java

package demo5.client;

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

import demo5.vo.MyRequestObject;
import demo5.vo.MyResponseObject;

public class MyClientHandler extends IoHandlerAdapter{
    private static final Logger logger = LoggerFactory.getLogger(MyClientHandler.class);

    @Override
    public void sessionCreated(IoSession session) throws Exception {
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        MyRequestObject myObj = new MyRequestObject("我的name", "我的value");
        session.write(myObj);
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        logger.error(cause.getMessage(), cause);
        session.close(true);
    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        MyResponseObject myResObj = (MyResponseObject) message;
        logger.info("Received " + myResObj);
        session.close(true);
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        logger.info("Sent " + message);
    }

}
时间: 2024-12-10 23:57:50

Mina传递对象的相关文章

mina传输对象

接触java的Mina框架已经有很多时间了,在网上也读过了很多的相关文章,发现Mina框架的确是一个值得拿来好好研究的东西,前些日子写了一个山寨QQ项目,其中的通信部分用到了java中自带的InputStream,OutputStream,Writer,Reader等等,感觉其中的很大的一个问题就是难以将事务处理的逻辑层与解析层分离开来,造成整个项目看起来比较臃肿,繁琐,不够模块化,接触Mina后发现mina在这方面做的很是恰到好处. 看到文章标题,你或许会有一些疑惑: 1.Mina框架传递对象

Android之Activity之间传递对象

在很多时候,我们需要在Activity之间传递对象,比如当你点击了某列表的item,需要传递给下一个Activity该对象,那我们需要该怎么做呢? Android支持两种传递对象的方式,一种是bundle.putSerializable方式,一种是bundle.putParcelable. 那么下面我们就用一个例子来实践Activity传递对象: 1.首先建立两个类,一个Teacher类表示老师,一个Student类表示学生.内容分别如下: <span style="font-size:1

MVC传递数据-传递对象或对象集合

前言 本文主要介绍从View(或者js)文件向Controller提交对象或者对象集合,比如,将表格中的一行数据作为一个对象提交,或将多行数据作为一个集合提交到Controller. 回顾 从View(或者js)文件向Controller提交数据,你可能见过以下几种方式: 将提交的数据附在url地址后面 $.ajax({ type: "POST", url: "/InviteBid/UpdateBidZRecord/?JudgeBidId=" + JudgeBidI

页面中传递对象的方法

1.QuerySting在页面间传递值 这种方法的写法:在要传递值的页面,Response.Redirect(url),值包含在在url中.接收值得页面,Request.QueryString["变量名"]. 这是使用起来很简单的一种方式,但是它不是很安全,因为值会在浏览器里的地址栏里显示.并且它也不能传递对象,对长度也有限制,如果要传递的值很多,且对安全要求也高的话,这种方式就不适合了.2.Session变量 我们通常在一个页面中,将值放到session变量中,在另外几个页面使用它.

Android中的Parcel机制 实现Bundle传递对象

Android中的Parcel机制    实现了Bundle传递对象    使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parcel机制,即,Android实现的轻量级的高效的对象序列化和反序列化机制. JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等.        Android中的新的序列

为什么Intent传递对象的时候必须要将对象序列化呢?

Intent可以算是四大组件之间的胶水,比如在Activity1与Activity2之间传递对象的时候,必须要将对象序列化, 可是为什么要将对象序列化呢? Intent在启动其他组件时,会离开当前应用程序进程,进入ActivityManagerService进程(intent.prepareToLeaveProcess()), 这也就意味着,Intent所携带的数据要能够在不同进程间传输. 首先我们知道,Android是基于Linux系统,不同进程之间的java对象是无法传输, 所以我们此处要对

通过Intent传递对象的两种方法

1 Serializable 2 Parcelable 实现方法: a.定义两个javaBean(Book,Person),分别implements Serializable和Parcelable b.建立Activity,用来传递Object对象和接收Object对象,通过Serializeable和Pacelable方法传递对象,分别调用方法 bundle.putSerializable(String key,Serializable value) bundle.putParcelable(

springMVC传递对象参数

初学java,由于项目紧急,来不及仔细的研究,在传递参数时就老老实实的一个一个的采用@RequestParam注解方式传递,最近认真看了一下,发现java也具有类似Asp.net Mvc传递对象做参数的方式,即采用@ModelAttribute注解的方式,接收方式如下: 1 @RequestMapping("hello") 2 public String Hello(@ModelAttribute("user") User user) 3 { 4 System.ou

使用HttpURLConnection实现在android客户端和服务器之间传递对象

一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml字符串然后传输,那么有没有可能我们直接在android客户端上传递一个Object给服务器端呢?答案是肯定的. 我们看一个简单的App注册页面,如下图: 当我们点击注册按钮的时候,将用户的注册信息通过一个Object对象传递到服务器,好,下来我们看看怎么样来传递对象: 首先我们要把用户的注册信息封装