- 浏览: 469551 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yakcy_33:
非常感谢
JSON字符串转javabean,MorphDynaBean cannot be cast to …… -
微Smile:
微Smile 写道还是没耐心 ...
迄今见过的最好的职业规划的文章 -
微Smile:
还是没耐心看完,再次 ...
迄今见过的最好的职业规划的文章 -
yobyppah:
非常感谢。
JSON字符串转javabean,MorphDynaBean cannot be cast to …… -
yupengcc:
非常感谢!
JSON字符串转javabean,MorphDynaBean cannot be cast to ……
Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API。
其中几个主要的组件如下:
I/O Service - 用来处理I/O流,对于Server端就是IOAcceptor的实现类接受Client端的连接请求,对于Client端就是IoConnector的实现类来建立到Server端的连接。
I/O Filter Chain - 用来过滤或转化数据。对于Server端和Client端来说都是IoFilter接口的实现类,MINA自己内建了很多IoFilter接口的实现类。具体可以参考官方文档。
I/O Handler - 用来处理真正业务逻辑的类。对于Server端和Client端来说都是IoHandler接口的实现类,通常来说需要自己编写。
由于Server端和Client端都是基于以上三个组件的,因此对于Server端和Client端编程来说就都有类似的代码结构。
对于Server端来说:
1. 创建I/O service - 这里就是创建IOAcceptor类监听端口。
2. 创建I/O Filter Chain - 这里就是告诉使用那些IoFilter。
3. 创建I/O Handler - 自己的业务逻辑。
对于Client端来说:
1. 创建I/O service - 这里就是创建IOConnector类来建立到Server端的连接。
2. 创建I/O Filter Chain - 这里就是告诉使用那些IoFilter。
3. 创建I/O Handler - 自己的业务逻辑。
对于简单的传输字符串,对mina来说是小菜一碟,当然它也可以用来传输对象。其基本过程为对象(客户端)->字节流(客户端)->发送->接收->字节流(服务器)->对象(服务器)。
服务器端代码(1)
package com.sohu.game.mina.sentObject;
import java.io.IOException; import java.net.InetSocketAddress; 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.transport.socket.SocketAcceptor; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MainServer { private static MainServer mainServer = null; private SocketAcceptor acceptor = new NioSocketAcceptor(); private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); private int bindPort = 8887; public static MainServer getInstances() { if (null == mainServer) { mainServer = new MainServer(); } return mainServer; } private MainServer() { //创建I/O Filter Chain //ProtocolCodecFilter实例用来编码数据,这里使用了ObjectSerializationCodecFactory类来序列化或反序列化数据成java对象。 chain.addLast("myChin", new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); acceptor.setHandler(ServerHandler.getInstances()); try { //让IoAcceptor类实例绑定端口实现监听 acceptor.bind(new InetSocketAddress(bindPort)); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { MainServer.getInstances(); } }
服务端代码(2)
package com.sohu.game.mina.sentObject;
import java.util.ArrayList; import java.util.List; import org.apache.mina.core.filterchain.IoFilterAdapter; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; public class ServerHandler extends IoFilterAdapter implements IoHandler { private static ServerHandler samplMinaServerHandler = null; public static ServerHandler getInstances() { if (null == samplMinaServerHandler) { samplMinaServerHandler = new ServerHandler(); } return samplMinaServerHandler; } private ServerHandler() { } // 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发 public void sessionOpened(IoSession session) throws Exception { } public void sessionClosed(IoSession session) { } /** * 创建I/O Handler,这里主要看一下messageReceived方法,其接收了Object对象,然后又发送了一个Object对象给Client端。 */ public void messageReceived(IoSession session, Object message) throws Exception { if (message instanceof UserInfo) { UserInfo text = (UserInfo) message; System.out.println("服务器接收到从客户端的姓名:"+text.getName()); System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum()); } if (message instanceof Condition) { Condition text = (Condition) message; List<Student> students = text.getStudents(); List<UserInfo> users = text.getUsers(); System.out.println("服务器端接收到从客户端的学生信息数:"+students.size()); System.out.println("服务器端接收到从客户端的用户信息数:"+users.size()); // System.out.println("服务器接收到从客户端的姓名:"+text.getName()); // System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum()); } else{ if(message instanceof Student){ System.out.println("哈哈"); } System.out.println("aaa"+message.getClass()); } } public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception { } // 当消息传送到客户端后触发 public void messageSent(IoSession arg0, Object arg1) throws Exception { } // 当一个新客户端连接后触发此方法. public void sessionCreated(IoSession arg0) throws Exception { } // 当连接空闲时触发此方法. public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception { } }
公共代码(1)
package com.sohu.game.mina.sentObject;
public class Student implements java.io.Serializable{ private String sname; private Integer age; public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
公共代码(2)
package com.sohu.game.mina.sentObject;
public class UserInfo implements java.io.Serializable{ private String name; private String QQNum; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getQQNum() { return QQNum; } public void setQQNum(String qQNum) { QQNum = qQNum; } }
客户端代码(1)
package com.sohu.game.mina.sentObject;
import java.net.InetSocketAddress; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.future.ConnectFuture; 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.transport.socket.nio.NioSocketConnector; public class MainClient { private static MainClient mainClient = null; NioSocketConnector connector = new NioSocketConnector(); DefaultIoFilterChainBuilder chain = connector.getFilterChain(); public static MainClient getInstances() { if (null == mainClient) { mainClient = new MainClient(); } return mainClient; } private MainClient() { chain.addLast("myChin", new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); connector.setHandler(ClientHandler.getInstances()); connector.setConnectTimeout(30); connector.setConnectTimeoutMillis(30000); ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 8887)); } public static void main(String args[]) { MainClient.getInstances(); } }
客户端代码(2)
package com.sohu.game.mina.sentObject;
import java.util.ArrayList; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; public class ClientHandler extends IoHandlerAdapter { private static ClientHandler samplMinaClientHandler = null; public static ClientHandler getInstances() { if (null == samplMinaClientHandler) { samplMinaClientHandler = new ClientHandler(); } return samplMinaClientHandler; } private ClientHandler() { } public void sessionOpened(IoSession session) throws Exception { session.write("客户端与服务器的会话打开了……"); UserInfo text=new UserInfo(); text.setName("梅竹寒香"); text.setQQNum("972341215"); Student s1 = new Student(); s1.setAge(89); s1.setSname("bianzhe"); Student s2 = new Student(); s2.setAge(88); s2.setSname("ganxin"); Condition con = new Condition(); ArrayList<Student> students = new ArrayList<Student>(); students.add(s1); students.add(s2); con.setStudents(students); ArrayList<UserInfo> users = new ArrayList<UserInfo>(); users.add(text); con.setUsers(users); //session.write(con); session.write(con); //session.write(text); } public void sessionClosed(IoSession session) { } public void messageReceived(IoSession session, Object message) throws Exception { } public void messageSent(IoSession arg0, Object arg1) throws Exception { System.out.println("客户端已经向服务器发送了:"+(String)arg1); } }
以上即是通过mina简单传递对象的过程。
发表评论
-
mysql replace into用法
2012-08-23 22:27 1178REPLACE的运行与INSERT很相似。只有一点例外, ... -
INSERT 中ON DUPLICATE KEY UPDATE和mysql replace into的使用
2012-08-23 22:27 2422MySQL 当记录不存在时插入,当记录存在时更新 网上 ... -
apache File does not exist: /usr/local/apache2/htdocs/favicon.ico
2012-08-22 20:58 10897今天查看apache日志,发现存在一些error日志 ... -
MySQL日期、时间类型相关
2012-08-21 21:33 2079MySQL 日期类型:日期格式、所占存储空间、日期范围 ... -
Oracle “CONNECT BY” 使用(二)
2012-08-21 21:13 1635Oracle “CONNECT BY”是层次查询子 ... -
Oracle中 Connect By用法(一)
2012-08-21 21:09 1477oracle中的select语句可以用START WIT ... -
spring+jotm+jta+xapool+hibernate+oracle架构中多数据源出现的问题
2012-08-01 16:31 3279公司一系统使用了spring+jotm+jta+xapool ... -
oracle的使用技巧
2012-07-28 11:52 10011.记录去重 delete from tlbb.tlb ... -
mysql命令
2012-07-14 17:24 8571.时间取整,取整10分 mysql> SELE ... -
JSON字符串转javabean,MorphDynaBean cannot be cast to ……
2012-06-24 15:58 32705在json字符串转java bean时,一般的对象,可以直 ... -
java与javascript中的json的使用
2012-06-12 14:10 5727json在java与javascript中的使用: ... -
XMLDecoder/XMLEncoder,今天你用了吗
2012-06-08 12:01 7172对于xml与java 对象的映射有很多方法,不错一般 ... -
JAVA中SERIALVERSIONUID
2012-05-31 14:59 881serialVersionUID作用: 序列化时 ... -
控制对象的序列化和反序列化
2012-05-31 11:54 804控制序列化就是有选择的序列化对象,而不是把对象的所以内容 ... -
java 中的序列化
2012-05-31 11:51 7941、序列化是干什么的? 简单说就是为了保存在内存中 ... -
MyEclipse自动提示功能设置
2012-05-29 21:34 787一般默认情况下,Eclipse ,MyEclipse 的 ... -
eclipse插件(更新中)
2012-05-26 16:33 8241.正则表达式插件:http://regex-util.sou ...
相关推荐
基于 TCP 协议的(通常会借助 Mina、Netty 等高性能网络框架) RPC (远程过程调用) 是什么 简单的说,RPC 就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为...
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序v
MobaXterm 工具
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
扁平风格PPT可修改ppt下载(11).zip
CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的msk信号调制解调过程,包括发送端及接收端信号谱分析过程+使用说明文档.rar 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!
有色金属行业周报有色金属稳增长目标明确工业及贵金属价格普涨-19页.pdf
Java_Tinker是Android的热修复解决方案库,它支持索引库和资源更新,无需重新安装apk
联邦学习驾驶员状态分类设计源码:该项目基于Python开发,包含20个文件,主要使用Python语言。该项目利用VGG19、efficientnet和Resnet50等深度学习模型对驾驶员状态数据集进行分类。近期工作中,项目加入了联邦学习的方法,引入了Shapley值和激励机制,以提高模型的准确性和鲁棒性。
比较上次: 1. 更换了图文混编显示,使用 setspan+glide 图片加载实现 2. 增加了全局主题选择 (用户自定义颜色只能实现部分对方) 3. 增加了历史记录和历史访问记录 4. 新添选择 帖子列表 样式 (简约风, 卡片风, 交流风, 西北风) 5. 除了查看帖子外,新增了 APP 界面风,用于介绍某一文件或某一 APP。 反正就逐渐向社区迈进,远离记录日常笔记 APP 越来越远了 文件后缀是.tsp 懂的拿着玩玩吧
下雨天适合吃火锅的文案.docx
EasyDropDownMenu筛选排序菜单设计源码:该项目基于Swift开发,包含60个文件,主要使用Swift语言。该设计源码实现了类似美团、糯米、大众点评的筛选排序菜单,适用于iOS应用中的筛选和排序功能,以提供用户更直观、便捷的交互体验。
表白代码是一种利用编程技术,通过特定的代码语言和结构来传达爱意的方式。这些代码可以通过多种方式实现,例如使用微信、网页、弹窗提示、控制台输出、图形绘制等,并且可以根据不同的场景和效果选择合适的表白方式。 以下是一些表白代码的示例和介绍: 微信表白代码:这是一种利用微信平台,通过发送包含特定代码的消息来传达爱意的方式。例如,可以使用一些有趣的代码,如“我想要两颗西柚”(实际上是“1 want to see you”,意为“我想要见你”)或者“Mg+ZnSO4==MgSO4+Zn”(意为“你的镁夺走了我的锌”,暗指“你的美丽夺走了我的心”)。 网页表白代码:通过创建一个包含特定动画、文字或图像的网页,来传达爱意。这种表白方式可以在网页上添加背景音乐、动画效果、表单提交等功能,使得表白更加生动和有趣。 弹窗提示表白代码:在打开某个网页或程序时,弹出一个包含表白信息的提示框。这种表白方式可以在用户不经意间触发,带来惊喜和感动。 控制台输出表白代码:在编程环境(如Python、JavaScript等)的控制台中输出一段表白的话语或图案。
如标题所述,内有详细说明
CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的杨氏双缝,光的干涉实验,基于滑动块改变参数+GUI界面+使用说明文档.zip 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
水泥混凝土用粗集料针片状颗粒含量试验记录表.docx
dotnet-core-uninstall-1.7.521001 github上下载下来,从github下载不下来时,可以使用这个,微软官方提供的.NET 卸载工具 C:\Windows\system32>dotnet-core-uninstall remove --all --sdk The following items will be removed: To avoid breaking Visual Studio or other problems, read https://aka.ms/dotnet-core-uninstall-docs. Do you want to continue? [y/n] n 我用着效果不好,没卸载掉dontnet