在看Mina源代码时发现其客户端Socket Connector的例子很少,耗费了我一些时间。相对传统IO的堵塞式,NIO 的优势和特色就在于非堵塞了。使用NIO的话,不管是服务器端还是客户端,都不用堵住了。这样就大大提高了服务处理的能力,也减少了等待的时间。当然,传统IO Socket编程通常都会使用一个专有线程监听连接请求,获悉新请求后产生其它线程来服务该连接。不管怎么样,这些服务都是同步操作。NIO就不一样了,什么都是通知的。打个比方,就像一个客人到商店预订商品,当商品齐全了,店长就可以将商品发送给客人,或者通知客人取货了。
由于采取了NIO,所以使用Mina时一定要有异步消息处理思想。这里提供一个简单的例子服务器端用传统IO 的ServerSocket,收到新请求后只是返回一个消息:
try {
Socket socket = this.serverSocket.accept();
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
if(dis.read(bytes) < 1024)
{
System.out.println(new String(bytes));
}
OutputStream os = socket.getOutputStream();
os.write(("This is server, your reservation number:["+i+"]").getBytes());
os.write(("\nAnything i can help?").getBytes());
os.flush();
os.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
传统Socket客户端实现:
public void request(byte [] reequest, ResponseHandler handler)
{
if(!socket.isConnected()){
throw new IllegalStateException("Socket not connected to["+address+":"+port+"].");
}
OutputStream os = null;
InputStream is = null;
DataInputStream dis = null;
try {
os = this.socket.getOutputStream();
os.write(reequest);
os.flush();
is = this.socket.getInputStream();
dis = new DataInputStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] bytes = new byte[1024];
int len = 0;
while((len = dis.read(bytes)) != -1)
{
baos.write(bytes, 0, len);
}
handler.handleResponse(baos.toByteArray());
} catch (IOException e) {
}finally
{
try {
dis.close();
} catch (IOException e) {
}
try {
os.close();
} catch (IOException e) {
}
try {
this.socket.close();
} catch (IOException e) {
}
}
}
Mina的Socket Connector方式:
public void test1()
{
try {
final StringBuffer buf = new StringBuffer();
SocketConnector connector = new SocketConnector();
ConnectFuture future = connector.connect(new InetSocketAddress(
"localhost", 9999), new IoHandlerAdapter() {
public void sessionCreated(IoSession session) {
log.debug("Session Created");
buf.append("1");
}
public void sessionOpened(IoSession session) {
log.debug("Session Opened");
WriteFuture writeFuture = session.write(ByteBuffer.wrap("Hello".getBytes()));
writeFuture.join();
}
public void exceptionCaught(IoSession session, Throwable cause) {
log.debug("Exception,", cause);
buf.append("X");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
if(message instanceof ByteBuffer)
{
ByteBuffer byteb = (ByteBuffer)message;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytearray = new byte[1024];
while(byteb.hasRemaining())
{
int len = Math.min(byteb.remaining(), 1024);
byteb.get(bytearray,0, len);
baos.write(bytearray, 0, len);
}
log.debug("Message from Server:" + new String(baos.toByteArray()));
}
}
@Override
public void messageSent(IoSession session, Object message)
throws Exception {
log.debug("Sent:" + message);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
log.debug("Session closed.");
super.sessionClosed(session);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
// TODO Auto-generated method stub
super.sessionIdle(session, status);
}
});
log.debug("connect future join begin.");
//等待连接准备
future.join();
log.debug("connect future join end.");
CloseFuture closeFuture = future.getSession().close();
log.debug("close future join begin.");
closeFuture.join();
log.debug("close future join end.");
}catch(Exception e)
{
e.printStackTrace();
}
}
分享到:
相关推荐
本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic Application Networking API”)是Apache软件基金会的一个开源项目,它为开发者提供了一...
《Mina NIO Socket:深度解析与应用》 在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket...
mina框架是Apache组织开发的一个网络通信框架,...通过这个项目,开发者不仅可以学习到MINA框架的基础使用,还能了解网络编程中的服务端与客户端交互原理,以及如何利用MINA提供的工具来构建高效、稳定的网络应用程序。
Socket通信和MINA长连接是网络编程中的两个关键概念,主要应用于服务器与客户端之间的数据交互。在移动应用开发,特别是需要实时推送功能时,这两种技术显得尤为重要。 **Socket通信** Socket,也称为套接字,是...
Socket Mina测试框架是一个强大的网络通信应用框架,主要用于简化Java应用程序与远程服务器之间的通信。它提供了高度可扩展和高性能的I/O处理模型,使得开发者能够更专注于业务逻辑,而不是底层的网络实现细节。Mina...
同时,“Netty快速入门视频(52im.net).txt”虽然不是直接与Mina相关的,但Netty也是基于NIO的高性能网络库,学习它的资料也能加深对NIO的理解。最后,“MinaDemo”可能是Mina框架的一个示例项目,你可以通过运行和...
mina简单示例,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速...
在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...
NIO (Non-blocking Input/Output) 是Java中的一种I/O模型,与传统的 blocking I/O 相比,它提供了更高效的数据处理方式。在传统的Socket编程中,每个连接都会创建一个新的线程进行处理,这在连接数量较少时是可行的...
在Mina2.0的示例代码中,客户端和服务器端通常包括以下步骤: 1. **配置服务端**:创建Acceptor,设置监听端口,添加必要的过滤器和处理器。 2. **启动服务端**:启动Acceptor,开始监听客户端连接。 3. **配置...
【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...
Java Socket和NIO(非阻塞I/O)是Java编程中的重要部分,它们在构建高性能、高并发的网络应用程序中发挥着关键作用。Socket是基于TCP/IP协议的应用层接口,而NIO则是一种I/O模型,它提供了不同于传统阻塞I/O的处理...
通过示例中的时间服务器程序,我们可以了解到MINA如何抽象出事件模型来处理网络事件,实现客户端与服务端之间的通信,以及如何通过过滤器链来增强和扩展程序的功能。对于希望实现高性能网络应用的开发者而言,MINA...
- NIO框架库:MINA利用Java的非阻塞I/O模型,提供高效的数据传输能力。 - 客户端-服务器框架库:MINA支持多种通信协议,可以构建客户端和服务器端应用。 - 网络socket库:MINA提供了一套完整的网络通信接口,方便...
描述进一步确认了这个项目是关于MINA框架与Socket应用的,意味着它可能包含了一个简单的服务器和客户端示例,用来展示如何在MINA中创建和管理Socket连接。"包含了所需jar"这部分意味着所有必要的依赖都已经包含在内...
5. **Android-tcp-long-connection-based-on-Apache-mina-master**:这个项目名表明它是一个基于Apache MINA实现的Android客户端与服务器之间的TCP长连接示例。在Android环境中,由于系统可能因内存管理等原因关闭...
在这个"MINA2 教程 socket"中,我们将探讨如何使用MINA2来实现服务器与客户端之间的通信,并且支持同时在线连接,以及如何利用`newFixedThreadPool`线程池来优化处理并发连接。 1. **MINA2基本概念**: MINA2的...
6. **配置与启动**:在Mina应用中,通常需要配置ServerBootstrap或ClientBootstrap,设定Socket选项,如接收缓冲区大小,以及添加过滤器和处理器。然后通过start()方法启动服务。 7. **异常处理**:在网络通信中,...