`
cuisuqiang
  • 浏览: 3962982 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3672331
社区版块
存档分类
最新评论

Mina TCP服务端客户端 示例

阅读更多

服务端代码:

package com.xd.nms.example;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import com.xd.nms.util.ByteAndStr16;
/**
 * @说明 Mina TCP 服务端
 * @author 崔素强
 * @version 1.0
 * @since
 */
public class MinaTcpServer extends IoHandlerAdapter {
	public static final int PORT = 18567;
	public MinaTcpServer() throws IOException {
		NioSocketAcceptor acceptor = new NioSocketAcceptor();
		acceptor.setHandler(this);
		acceptor.bind(new InetSocketAddress(PORT));
		System.out.println("TCP服务启动,端口:" + PORT);
	}
	public static void main(String[] args) throws IOException {
		new MinaTcpServer();
	}
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		IoBuffer bbuf = (IoBuffer) message;
		byte[] byten = new byte[bbuf.limit()];
		bbuf.get(byten, bbuf.position(), bbuf.limit());
		System.out.println("收到消息:" + ByteAndStr16.Bytes2HexString(byten));
		byte[] bts = new byte[10];
		for(int i=0;i<10;i++){
			bts[i] = (byte)i;
		}
		IoBuffer buffer = IoBuffer.allocate(10);
		buffer.put(bts);
		buffer.flip();
		session.write(buffer);
//		// 拿到所有的客户端Session
//		Collection<IoSession> sessions = session.getService().getManagedSessions().values();
//		// 向所有客户端发送数据
//		for (IoSession sess : sessions) {
//			sess.write(buffer);
//		}
	}
	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("会话关闭");
	}
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		System.out.println("会话异常");
		super.exceptionCaught(session, cause);
	}
	@Override
	public void messageSent(IoSession iosession, Object obj) throws Exception {
		System.out.println("服务端消息发送");
		super.messageSent(iosession, obj);
	}
	@Override
	public void sessionCreated(IoSession iosession) throws Exception {
		System.out.println("会话创建");
		super.sessionCreated(iosession);
	}
	@Override
	public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
			throws Exception {
		System.out.println("会话休眠");
		super.sessionIdle(iosession, idlestatus);
	}
	@Override
	public void sessionOpened(IoSession iosession) throws Exception {
		System.out.println("会话打开");
		super.sessionOpened(iosession);
	}
}

 

 服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去

注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的

 

客户端程序:

package com.xd.nms.example;
import java.net.InetSocketAddress;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import com.xd.nms.util.ByteAndStr16;
/**
 * @说明 Mina TCP客户端
 * @author 崔素强
 * @version 1.0
 * @since
 */
public class MinaTcpClient extends IoHandlerAdapter {
	private IoConnector connector;
	private static IoSession session;
	public MinaTcpClient() {
		connector = new NioSocketConnector();
		connector.setHandler(this);
		ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT));
		connFuture.awaitUninterruptibly();
		session = connFuture.getSession();
		System.out.println("TCP 客户端启动");
	}
	public static void main(String[] args) throws Exception {
		MinaTcpClient client = new MinaTcpClient();
		for(int j=0;j<2;j++){ // 发送两遍
			byte[] bts = new byte[20];
			for (int i = 0; i < 20; i++) {
				bts[i] = (byte) i;
			}
			IoBuffer buffer = IoBuffer.allocate(20);
			// 自动扩容
			buffer.setAutoExpand(true);
			// 自动收缩
			buffer.setAutoShrink(true);
			buffer.put(bts);
			buffer.flip();
			session.write(buffer);
			Thread.sleep(2000);
		}
		// 关闭会话,待所有线程处理结束后
		client.connector.dispose(true);
	}
	@Override
	public void messageReceived(IoSession iosession, Object message)
			throws Exception {
		IoBuffer bbuf = (IoBuffer) message;
		byte[] byten = new byte[bbuf.limit()];
		bbuf.get(byten, bbuf.position(), bbuf.limit());
		System.out.println("客户端收到消息" + ByteAndStr16.Bytes2HexString(byten));
	}
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		System.out.println("客户端异常");
		super.exceptionCaught(session, cause);
	}
	@Override
	public void messageSent(IoSession iosession, Object obj) throws Exception {
		System.out.println("客户端消息发送");
		super.messageSent(iosession, obj);
	}
	@Override
	public void sessionClosed(IoSession iosession) throws Exception {
		System.out.println("客户端会话关闭");
		super.sessionClosed(iosession);
	}
	@Override
	public void sessionCreated(IoSession iosession) throws Exception {
		System.out.println("客户端会话创建");
		super.sessionCreated(iosession);
	}
	@Override
	public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
			throws Exception {
		System.out.println("客户端会话休眠");
		super.sessionIdle(iosession, idlestatus);
	}
	@Override
	public void sessionOpened(IoSession iosession) throws Exception {
		System.out.println("客户端会话打开");
		super.sessionOpened(iosession);
	}
}

 

 向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!

 

打印结果:

TCP服务启动,端口:18567
会话创建
会话打开
收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 
服务端消息发送
收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 
服务端消息发送
会话关闭

 

 

客户端会话创建
客户端会话打开
TCP 客户端启动
客户端消息发送
客户端收到消息00 01 02 03 04 05 06 07 08 09 
客户端消息发送
客户端收到消息00 01 02 03 04 05 06 07 08 09 
客户端会话关闭

 

 请您到ITEYE网站看原创,谢谢!

http://cuisuqiang.iteye.com/ ! 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

2
5
分享到:
评论
4 楼 qyhdt 2014-09-20  
客户端代码Thread.sleep(2000);这一句屏蔽后,messageReceived无法接受信息
3 楼 cuisuqiang 2013-06-25  
teasp 写道
Mina里面有打印16进制的工具类。

这个真没注意
2 楼 teasp 2013-06-24  
Mina里面有打印16进制的工具类。
1 楼 cuisuqiang 2013-06-24  
大家看到的打印是16进制的打印,关于转换的工具类:
package com.xd.nms.util;
/**
 * @说明 十六进制与十进制之间的转换
 * @author 崔素强
 * @version 1.0
 * @since
 */
public class ByteAndStr16 {
	private final static byte[] hex = "0123456789ABCDEF".getBytes();
	private static int parse(char c) {
		if (c >= 'a')
			return (c - 'a' + 10) & 0x0f;
		if (c >= 'A')
			return (c - 'A' + 10) & 0x0f;
		return (c - '0') & 0x0f;
	}
	// 从字节数组到十六进制字符串转换
	public static String Bytes2HexString(byte[] b) {
		byte[] buff = new byte[3 * b.length];
		for (int i = 0; i < b.length; i++) {
			buff[3 * i] = hex[(b[i] >> 4) & 0x0f];
			buff[3 * i + 1] = hex[b[i] & 0x0f];
			buff[3 * i + 2] = 45;
		}
		String re = new String(buff);
		return re.replace("-", " ");
	}
	// 从十六进制字符串到字节数组转换
	public static byte[] HexString2Bytes(String hexstr) {
		hexstr = hexstr.replace(" ", "");
		byte[] b = new byte[hexstr.length() / 2];
		int j = 0;
		for (int i = 0; i < b.length; i++) {
			char c0 = hexstr.charAt(j++);
			char c1 = hexstr.charAt(j++);
			b[i] = (byte) ((parse(c0) << 4) | parse(c1));
		}
		return b;
	}
}

相关推荐

    Mina 服务端客户端示例程序

    4. **服务端构建**:在服务端示例中,我们将看到如何创建IoAcceptor实例,配置监听端口,并绑定IoHandler来处理客户端的连接请求。服务端还会设置过滤器链来处理进来的数据。 5. **客户端构建**:客户端示例将演示...

    mina2服务端客户端实例,保证能够正常运行

    MINA提供了一种与传输协议无关的抽象层,使得开发者可以轻松地构建基于TCP/IP、UDP/IP或其他I/O协议的服务端和客户端应用。 标题中提到的"mina2服务端客户端实例"是指使用Apache MINA 2版本创建的一个工作示例,该...

    MINA 服务端和客户端demo

    在"minaServer.rar"和"minaClient.rar"这两个压缩包中,分别包含了服务端和客户端的源代码示例。通过学习和运行这些示例,你可以深入了解MINA如何工作,以及如何利用MINA快速开发自己的网络应用。在实际项目中,可以...

    android mina 即时通讯 服务端客户端代码

    《Android Mina即时通讯:服务端与客户端代码详解》 在移动应用开发中,即时通讯功能已经成为不可或缺的一部分,尤其在社交应用中更是如此。本文将深入探讨如何利用Apache Mina框架在Android平台上实现即时通讯...

    mina server开发服务端/客户端代码

    本压缩包包含的是使用Mina Server开发的服务端和客户端的源代码示例,非常适合初学者和有经验的开发者用来学习和参考。 服务端开发: 在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接...

    mina 长连接 客户端+服务端

    在这个"mina 长连接 客户端+服务端"的示例中,我们将探讨如何使用Mina实现长连接以及收发消息的功能。 长连接是网络通信中的一种模式,与短连接相对。短连接在每次通信后都会关闭连接,而长连接则保持连接状态,...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    “服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)” 这个标题表明这是一个使用MINA2框架在服务端实现的UDP(User Datagram Protocol)双向通信的示例代码。MINA2是一个开源的Java网络应用程序框架,它简化了...

    mina框架中socket使用,有服务端和客户端。

    本项目提供了服务端和客户端的示例,使得开发者能够更好地理解和应用MINA框架。 1. **MINA框架**:MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、易用的网络应用框架,它为开发者...

    mina 同步客户端,异步客户端

    5. **mina_test**:这个文件可能是MINA项目的测试代码,包含了服务端和客户端的示例。开发者通常会编写测试代码来验证MINA应用程序的正确性和性能。通过阅读和运行这些测试,我们可以更好地理解MINA的工作原理,以及...

    mina及时推送客户端服务端实现

    5. **Android-tcp-long-connection-based-on-Apache-mina-master**:这个项目名表明它是一个基于Apache MINA实现的Android客户端与服务器之间的TCP长连接示例。在Android环境中,由于系统可能因内存管理等原因关闭...

    apache_mina_maven 客户端测试程序

    在“apache_mina_maven 客户端测试程序”中,我们可以推断这是一份使用 Maven 构建系统的 Apache MINA 客户端示例代码。Maven 是一个项目管理和综合工具,它帮助 Java 开发者管理项目的构建、报告和文档生成过程。...

    利用Mina进行TCP通信

    本文将深入探讨如何利用Mina实现服务端和客户端的TCP通信,并结合JavaDemo1这一示例代码进行详细解析。 首先,理解Mina的基本概念。Mina提供了一种简化网络编程的抽象层,使得开发者可以专注于业务逻辑,而不是底层...

    mina项目示例

    这个“mina项目示例”很可能是通过MINA框架实现了一个客户端和服务端的通信示例。它可能包括以下部分: 1. **服务端启动**:创建MINA服务器端,监听指定端口,设置相应的处理器和过滤器链。 2. **客户端连接**:...

    mina简单示例

    描述中的"mina简单客户端服务端示例"意味着我们将探讨如何使用Mina来创建一个基本的通信环境,包括一个能够发起连接的客户端和一个接收连接的服务端。这两个组件是任何网络通信系统的基础,通过它们,数据可以在不同...

    apache mina 简单示例

    7. **Asynchronous Communication**:Mina使用非阻塞I/O,允许服务端同时处理多个客户端请求,提高了系统并发能力。 8. **编码与解码**:Mina提供了一些内置的编码器和解码器,如LineDelimiter、CrLfLineDecoder等...

    mina服务器简单代码示例

    Mina服务器是一个基于Java开发的网络通信框架,它提供了高度可扩展和高性能的服务端和客户端API,常用于构建网络应用,如TCP/IP和UDP服务。本示例将介绍如何使用Mina实现一个简单的服务器端代码,并运行...

    Mina+Socket通信

    以下是一个基本的服务端示例: ```java import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.future.ConnectFuture; import org....

    服务端基于MINA2的UDP双向通信Demo演示(Java客户端)

    标题中的“服务端基于MINA2的UDP双向通信Demo演示(Java客户端)”是指使用Apache MINA框架在Java中实现的UDP(用户数据报协议)的双向通信示例。MINA是一个高性能、异步的网络应用程序框架,常用于构建网络服务,如...

    mina连接 mina心跳连接 mina断线重连

    在Mina中,连接是指客户端与服务端之间建立的通信链路。它支持多种传输协议,如TCP/IP(Socket)、UDP(Datagram)等。Mina提供了一种事件驱动的模型,通过IoSession接口来管理连接,包括读写数据、添加监听器、关闭...

    mina2推送demo服务端

    开发者或使用者可以放心地将这个服务端示例用于实际的推送场景,例如即时消息传递、系统通知等。 标签“mina”进一步确认了该项目与Apache Mina框架的关联性。在Java开发中,Mina常被用来构建基于TCP或UDP的网络...

Global site tag (gtag.js) - Google Analytics