【mina】mina传输对象
来源:互联网 发布:挪威和丹麦知乎 编辑:程序博客网 时间:2024/04/26 17:07
接触java的Mina框架已经有很多时间了,在网上也读过了很多的相关文章,发现Mina框架的确是一个值得拿来好好研究的东西,前些日子写了一个山寨QQ项目,其中的通信部分用到了java中自带的InputStream,OutputStream,Writer,Reader等等,感觉其中的很大的一个问题就是难以将事务处理的逻辑层与解析层分离开来,造成整个项目看起来比较臃肿,繁琐,不够模块化,接触Mina后发现mina在这方面做的很是恰到好处。
看到文章标题,你或许会有一些疑惑:
public void messageReceived(IoSession session, Object message),这是进行消息接收是能够被 触发的一个方法,参数session代表当前的会话对象,参数message代表接收的到的信息,这时您会发现message的类型是Object型,而类 Object
- package
Mina.server; -
- import
java.io.IOException; - import
java.net.InetSocketAddress; -
- import
org.apache.mina.core.filterchain.DefaultIoFilterChainBuil der; - import
org.apache.mina.filter.codec.ProtocolCodecFilter; - import
org.apache.mina.filter.codec.serialization.ObjectSerializationCodec Factory; - 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 DefaultIoFilterChainBuil der chain = acceptor.getFilterChain(); -
private int bindPort = 8888; -
-
public static MainServer getInstances() { -
if (null == mainServer) { -
mainServer = new MainServer(); -
} -
return mainServer; -
} -
-
private MainServer() { -
chain.addLast("myChin", new ProtocolCodecFilter( -
new ObjectSerializationCodec Factory())); -
acceptor.setHandler(ServerHandler.getInstances()); -
try { -
acceptor.bind(new InetSocketAddress(bindPort)); -
} catch (IOException e) { -
e.printStackTrace(); -
} -
} -
-
public static void main(String[] args) throws Exception { -
MainServer.getInstances(); -
} - }
- package
Mina.server; -
- 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; -
- import
Mina.Object.UserInfo; -
- 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) { -
} -
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()); -
} -
} -
-
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
Mina.client; -
- import
java.net.InetSocketAddress; -
- import
org.apache.mina.core.filterchain.DefaultIoFilterChainBuil der; - import
org.apache.mina.core.future.ConnectFuture; - import
org.apache.mina.filter.codec.ProtocolCodecFilter; - import
org.apache.mina.filter.codec.serialization.ObjectSerializationCodec Factory; - import
org.apache.mina.transport.socket.nio.NioSocketConnector; -
- public
class MainClient { -
private static MainClient mainClient = null; -
NioSocketConnector connector = new NioSocketConnector(); -
DefaultIoFilterChainBuil der chain = connector.getFilterChain(); -
-
public static MainClient getInstances() { -
if (null == mainClient) { -
mainClient = new MainClient(); -
} -
return mainClient; -
} -
-
private MainClient() { -
chain.addLast("myChin", new ProtocolCodecFilter( -
new ObjectSerializationCodec Factory())); -
connector.setHandler(ClientHandler.getInstances()); -
connector.setConnectTimeout(30); -
ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", -
8888)); -
} -
-
public static void main(String args[]) { -
MainClient.getInstances(); -
} - }
客户端(2):
- package
Mina.client; -
- import
org.apache.mina.core.service.IoHandlerAdapter; - import
org.apache.mina.core.session.IoSession; -
- import
Mina.Object.UserInfo; -
- 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"); -
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); -
} - }
公共类:
- package
Mina.Object; -
- 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、包的引进是否妥当 2、是否引入了mina的第三方包(网上有了很多的相关文章,在此就不在赘述了)
通过程序您会看到对象已经成功传递并进行了相关属性的输出,对于这个简单的程序我稍做些相关说明:
如果你看到上面的实例就觉得对象传递的学习已经成功了,那就错了,细心的博友看到这个包结构:
是不是有点问题呢。
- 【mina】mina传输对象
- 使用Mina传输Java对象
- mina对象压缩后传输
- Apache MINA实战之 对象传输
- Mina实现传输对象的编解码
- Apache MINA实战之 对象传输
- Mina二进制传输对象IoBuffer的使用
- Mina二进制传输对象IoBuffer的使用
- 用mina传输文件
- mina传输文件
- mina 传输图片
- MINA
- mina
- MINA
- mina
- mina
- MINA
- mina
- 【多线程】 java线程实例(测试阻塞队列&&线程池)
- Ubuntu burg
- 用Delphi操作INI文件
- Delphi中建议使用的语句
- 创建一个Android程序(简单介绍工程里面各个文件的作用)
- 【mina】mina传输对象
- IMEI & Android ID
- 【java日志】java.util.logging.Logger使用详解
- 如何在js中获取当前项目的根路径
- 计算机图形学之画线算法
- mysql的wait_out参数
- 【6】CSS布局属性及简单网页制作
- Design patterns for replacing modal windows
- 【加密与解密】AES加密算法原理简介