`

用mina+applet实现推送技术

阅读更多

最近用到了前台推送技术,一开始用了comet4j 但是发现偶尔会断开,所以探寻了另一条出路。mina+applet实现推送技术。

分为三步:一.编写mina服务端,客户端代码。(先调试好)

                 二.将客户端类变成applet类, 进行签章等设置

                 三.实现applet 和 jsp 通信

上代码,边看代码边将:

1.服务端类MinaServer

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

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * 服务器启动类
 * 
 * @author JiangBo
 */
public class MinaServer {
    /**
     * 单例
     */
    private static MinaServer instance = new MinaServer();
    public static MinaServer getInstance() {
        return instance;
    }
    private MinaServer() {
    }
    
    // 端口设置
    private static int PORT = 30001;
    private SocketAcceptor acceptor;
    
    /**
     * 初始化方法
     * 
     * @return
     */
    public boolean start() {
        // 创建非阻塞的server端的Socket连接
        acceptor = new NioSocketAcceptor();
        DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain();
        // 添加编码过滤器 处理乱码、编码问题
      //  filterChain.addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));

        // 设置核心消息业务处理器
        acceptor.setHandler(new ServerMessageHandler());
        // 设置session配置,30秒内无操作进入空闲状态
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);

        try {
            // 绑定端口
            acceptor.bind(new InetSocketAddress(PORT));
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 向客户端发送(推送)消息
     */
    public void sendMessage(String host, String port, String value) {
        // 实例化一个向客户端发送的socket对象
        Collection<IoSession> sessions = acceptor.getManagedSessions().values();
        for (IoSession sess : sessions) {
            sess.write(value);
        }
    }

    /**
     * main方法
     * 
     * @param args
     */
    public static void main(String[] args) {
        //
        MinaServer server = MinaServer.getInstance();
        server.start();
        System.out.println("服务器启动成功=================");
    }
}

 2.ServerMessageHandler类

 

import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.IoFuture;
import org.apache.mina.core.future.IoFutureListener;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

/**
 * 处理服务器端消息
 * 
 * @author JiangBo
 */
public class ServerMessageHandler implements IoHandler {

    /**
     * 服务器发生异常
     */
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        System.out.println("服务器发生异常: " + cause.getMessage());
    }

    /**
     * 接收数据
     */
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        System.out.println("服务器接收到数据:" + message);
    }

    /**
     * 发送消息
     */
    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        System.out.println("服务器发送消息: " + message);
    }

    /**
     * 关闭链接
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("关闭当前session:" + session.getId() + session.getRemoteAddress());

        CloseFuture closeFuture = session.close(true);
        closeFuture.addListener(new IoFutureListener<IoFuture>() {
            public void operationComplete(IoFuture future) {
                if (future instanceof CloseFuture) {
                    ((CloseFuture) future).setClosed();
                    System.out.println("sessionClosed CloseFuture setClosed-->" + future.getSession().getId() + ",");
                }
            }
        });
    }

    /**
     * 创建连接
     */
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("创建一个新连接:" + session.getRemoteAddress());
        session.write("session created:" + session.getRemoteAddress());
    }

    /**
     * 空闲
     */
    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        System.out.println("当前连接" + session.getRemoteAddress() + "处于空闲状态:" + status);
    }

    /**
     * 打开一个session链接
     */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        System.out.println("打开一个session:"+ session.getId() + session.getBothIdleCount());
    }
}

 3.MinaClient客户端类

 

import java.applet.Applet;
import java.net.InetSocketAddress;

import netscape.javascript.JSObject;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import com.txsoft.ipcc.common.mina.service.CharsetCodecFactory;
 
/**
 * mina客户端
 * 
 * @author JiangBo
 */
public class MinaClient extends Applet {
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private static String IP = "192.168.1.30";
    
    private static int PORT = 30001;
    private SocketConnector connector;
    private ConnectFuture future;
    private IoSession session;
 
    public void init() {
        JSObject window= null;
        try {
            window=JSObject.getWindow(this);
            window.eval("alert('start begin!')");
        } catch (Exception e) {
            
        }
        
        // 创建一个socket连接
        connector = new NioSocketConnector();
        // 设置链接超时时间
        connector.setConnectTimeoutMillis(3000);
        // 获取过滤器链
        DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
        // 添加编码过滤器 处理乱码、编码问题
        filterChain.addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));
 
        // 消息核心处理器
        connector.setHandler(new ClientMessageHandlerAdapter(this));
 
        // 连接服务器,知道端口、地址
        future = connector.connect(new InetSocketAddress(IP, PORT));
        // 等待连接创建完成
        future.awaitUninterruptibly();
        // 获取当前session
        session = future.getSession();
        // 
        try {
            window.eval("alert('end!')");
        } catch (Exception e) {
            
        }
    }
 
    public void setAttribute(Object key, Object value) {
        session.setAttribute(key, value);
    }
 
    /**
     * 发送
     * @param message
     */
    public void send(String message) {
        session.write(message);
    }
    
    /**
     * 发送信息到JSP
     * @param message
     */
    public void sendJsp(String message) {
        // 获取JavaScript窗口句柄,引用当前文档窗口
        JSObject window = JSObject.getWindow(MinaClient.this);
        // 调用页面上的js方法 show(message)
        Object obj[] = new Object[1];
        obj[0] = message;
        window.call("show", obj);// 参数用数组的形势表示。
    }
 
    public boolean close() {
        CloseFuture future = session.getCloseFuture();
        future.awaitUninterruptibly(1000);
        connector.dispose();
        return true;
    }
 
    public SocketConnector getConnector() {
        return connector;
    }
 
    public IoSession getSession() {
        return session;
    }
}

 4.ClientMessageHandlerAdapter类

 

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
 
/**
 * 客户端消息处理类
 * @author JiangBo
 */
public class ClientMessageHandlerAdapter extends IoHandlerAdapter {
    private MinaClient minaClient = null;
    public ClientMessageHandlerAdapter(MinaClient minaClient) {
        this.minaClient = minaClient;
    }
    /**
     * 接收到消息
     */
    public void messageReceived(IoSession session, Object message) throws Exception {
        // 接到消息无处理
        System.out.println("messageSent服务端发送到客户端的消息:" + message);
        if (null != this.minaClient) {
            try {
                this.minaClient.sendJsp(message.toString());
            } catch (Exception e) {
            }
        }
    }
    
    public void messageSent(IoSession session , Object message) throws Exception{
        System.out.println("messageSent 客户端发送消息:" + message);
    }
    
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        System.out.println("服务器发生异常: {}" + cause.getMessage());
    }
}

5. jsp文件

 

<%@ page contentType="text/html; charset=utf-8"%>
<html>
 <head>
  <title> test mina push </title>
 </head>
 
 <body>
    <applet name = "testapplet" code = 'com.txsoft.ipcc.common.mina.client.MinaClient.class' 
          archive = 'minaClient.jar' width = 100 height = 50 MAYSCRIPT>
    </applet>
    <script type="text/javascript">
         function show(message){
             alert(message);
         }
     </script>
 </body>
</html>

 注意:例子中要把代码打包放在跟目录下,例子中jar包名叫:minaClient.jar。jar包还需要密码的支持所以打包时候还要把mima的支持包打进去。把下面3个包放在跟minaClient.jar同级目录下。

 

          1.mina-core-2.0.7.jar

           2.slf4j-api-1.7.6.jar

           3.slf4j-jdk14-1.7.7.jar

打包时候我是通过MANIFEST.MF文件选择了密码支持的3个包

MANIFEST.MF内容:

Manifest-Version: 1.0
Class-Path: mina-core-2.0.7.jar slf4j-api-1.7.6.jar slf4j-jdk14-1.7.7.jar

 

 

由于是Applet所以需要生成证书及签名所以在服务端cmd调出命令框 执行授权:
       1、keytool -genkey -keystore pepper.store -alias pepper
  这个命令用来产生一个密匙库,执行完毕后应该在c:/admin中产生一个pepper.store的文件,这里的pepper是我自己的名字,你可以对它进行修改。另外在执行命令的时候还有提示你输入密匙库的密码,这里你一定要记住,否则后面要用的时候无法输入。

  2、keytool -export -keystore pepper.store -alias pepper -file pepper.cert
  这个命令用来产生签名时所要用的证书,同样这里的pepper也可以换成你自己需要的名字。这个命令执行完后在c:/admin中产生一个pepper.cert的文件。

  3、 jarsigner -keystore pepper.store E:\workspace_IPCC\IPCC\WebRoot\minaClient.jar pepper
  这个命令用上面产生的证书将我们的jar文件进行了签名。(可以写绝对路径)

 

 在客户端设置security

 C:\Program Files (x86)\Java\jre6\lib\security\java.policy

在最下面添加这句,是允许所有IP 所有端口的权限,让然你可以可以指定IP 和端口

permission java.net.SocketPermission "*:*","accept,connect,resolve";

 

好了 小伙伴们 快去试试吧~

 需要的jar包:

 

分享到:
评论

相关推荐

    SNS单模无芯光纤仿真与传感器结构特性分析——基于Rsoft beamprop模块

    内容概要:本文主要探讨了SNS单模无芯光纤的仿真分析及其在通信和传感领域的应用潜力。首先介绍了模间干涉仿真的重要性,利用Rsoft beamprop模块模拟不同模式光在光纤中的传播情况,进而分析光纤的传输性能和模式特性。接着讨论了光纤传输特性的仿真,包括损耗、色散和模式耦合等参数的评估。随后,文章分析了光纤的结构特性,如折射率分布、包层和纤芯直径对性能的影响,并探讨了镀膜技术对光纤性能的提升作用。最后,进行了变形仿真分析,研究外部因素导致的光纤变形对其性能的影响。通过这些分析,为优化光纤设计提供了理论依据。 适合人群:从事光纤通信、光学工程及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解SNS单模无芯光纤特性和优化设计的研究项目,旨在提高光纤性能并拓展其应用场景。 其他说明:本文不仅提供了详细的仿真方法和技术细节,还对未来的发展方向进行了展望,强调了SNS单模无芯光纤在未来通信和传感领域的重要地位。

    发那科USM通讯程序socket-rece

    发那科USM通讯程序socket-set

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    JS+HTML源码与image

    源码与image

    物流行业车辆路径优化:基于遗传算法和其他优化算法的MATLAB实现及应用

    内容概要:本文详细探讨了物流行业中路径规划与车辆路径优化(VRP)的问题,特别是针对冷链物流、带时间窗的车辆路径优化(VRPTW)、考虑充电桩的车辆路径优化(EVRP)以及多配送中心情况下的路径优化。文中不仅介绍了遗传算法、蚁群算法、粒子群算法等多种优化算法的理论背景,还提供了完整的MATLAB代码及注释,帮助读者理解这些算法的具体实现。此外,文章还讨论了如何通过MATLAB处理大量数据和复杂计算,以得出最优的路径方案。 适合人群:从事物流行业的研究人员和技术人员,尤其是对路径优化感兴趣的开发者和工程师。 使用场景及目标:适用于需要优化车辆路径的企业和个人,旨在提高配送效率、降低成本、确保按时交付货物。通过学习本文提供的算法和代码,读者可以在实际工作中应用这些优化方法,提升物流系统的性能。 其他说明:为了更好地理解和应用这些算法,建议读者参考相关文献和教程进行深入学习。同时,实际应用中还需根据具体情况进行参数调整和优化。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    基于灰狼优化算法的城市路径规划Matlab实现——解决TSP问题

    内容概要:本文介绍了基于灰狼优化算法(GWO)的城市路径规划优化问题(TSP),并通过Matlab实现了该算法。文章详细解释了GWO算法的工作原理,包括寻找猎物、围捕猎物和攻击猎物三个阶段,并提供了具体的代码示例。通过不断迭代优化路径,最终得到最优的城市路径规划方案。与传统TSP求解方法相比,GWO算法具有更好的全局搜索能力和较快的收敛速度,适用于复杂的城市环境。尽管如此,算法在面对大量城市节点时仍面临运算时间和参数设置的挑战。 适合人群:对路径规划、优化算法感兴趣的科研人员、学生以及从事交通规划的专业人士。 使用场景及目标:①研究和开发高效的路径规划算法;②优化城市交通系统,提升出行效率;③探索人工智能在交通领域的应用。 其他说明:文中提到的代码可以作为学习和研究的基础,但实际应用中需要根据具体情况调整算法参数和优化策略。

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    物理学领域十字形声子晶体的能带与传输特性研究及应用

    内容概要:本文详细探讨了十字形声子晶体的能带结构和传输特性。首先介绍了声子晶体作为新型周期性结构在物理学和工程学中的重要地位,特别是十字形声子晶体的独特结构特点。接着从散射体的形状、大小、排列周期等方面分析了其对能带结构的影响,并通过理论计算和仿真获得了能带图。随后讨论了十字形声子晶体的传输特性,即它对声波的调控能力,包括传播速度、模式和能量分布的变化。最后通过大量实验和仿真验证了理论分析的正确性,并得出结论指出散射体的材料、形状和排列方式对其性能有重大影响。 适合人群:从事物理学、材料科学、声学等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解声子晶体尤其是十字形声子晶体能带与传输特性的科研工作者,旨在为相关领域的创新和发展提供理论支持和技术指导。 其他说明:文中还对未来的研究方向进行了展望,强调了声子晶体在未来多个领域的潜在应用价值。

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_.zip

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_

    e2b8a-main.zip

    e2b8a-main.zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    【HarmonyOS分布式技术】远程启动子系统详解:跨设备无缝启动与智能协同的应用场景及未来展望

    内容概要:本文详细介绍了HarmonyOS分布式远程启动子系统,该系统作为HarmonyOS的重要组成部分,旨在打破设备间的界限,实现跨设备无缝启动、智能设备选择和数据同步与连续性等功能。通过分布式软总线和分布式数据管理技术,它能够快速、稳定地实现设备间的通信和数据同步,为用户提供便捷的操作体验。文章还探讨了该系统在智能家居、智能办公和教育等领域的应用场景,展示了其在提升效率和用户体验方面的巨大潜力。最后,文章展望了该系统的未来发展,强调其在技术优化和应用场景拓展上的无限可能性。 适合人群:对HarmonyOS及其分布式技术感兴趣的用户、开发者和行业从业者。 使用场景及目标:①理解HarmonyOS分布式远程启动子系统的工作原理和技术细节;②探索该系统在智能家居、智能办公和教育等领域的具体应用场景;③了解该系统为开发者提供的开发优势和实践要点。 其他说明:本文不仅介绍了HarmonyOS分布式远程启动子系统的核心技术和应用场景,还展望了其未来的发展方向。通过阅读本文,用户可以全面了解该系统如何通过技术创新提升设备间的协同能力和用户体验,为智能生活带来新的变革。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    COMSOL相控阵检测技术在有机玻璃斜楔中检测工件内部缺陷的应用研究

    内容概要:本文详细介绍了COMSOL相控阵检测技术在有机玻璃斜楔上放置16阵元进行工件内部缺陷检测的方法。首先阐述了相控阵检测技术的基本原理,特别是通过控制各阵元的激发时间和相位来实现声波的聚焦和扫描。接着,重点解析了横孔缺陷的反射接收波,解释了波的折射现象及其背后的物理原因。最后,通过实例展示了COMSOL模拟声波传播过程的成功应用,验证了该技术的有效性和准确性。 适合人群:从事固体力学、无损检测领域的研究人员和技术人员,尤其是对相控阵检测技术和COMSOL仿真感兴趣的读者。 使用场景及目标:适用于需要精确检测工件内部缺陷的研究和工业应用场景,旨在提高检测精度和效率,确保产品质量和安全。 其他说明:文中提到的声速匹配现象有助于理解波在不同介质间的传播特性,这对优化检测参数设置有重要意义。

    少儿编程scratch项目源代码文件案例素材-极速奔跑者.zip

    少儿编程scratch项目源代码文件案例素材-极速奔跑者.zip

Global site tag (gtag.js) - Google Analytics