`
MoonMonster
  • 浏览: 36530 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

netty3.0的服务端及客户端的搭建

阅读更多

 

不喜欢写描述什么的,基本上使用步骤,注意事项都在代码注释中标明了,而相关的内容网上有很多,比自己的理解更好,所以自己对某个知识点的理解则都写在了为知笔记中。

1、服务端的编写

package com.netty.helloserver;

import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;

/**
 * @author Chalmers 2016年2月18日 下午6:49:57
 */
public class NettyServer {

	public static void main(String[] args) {
		// 创建服务类对象
		ServerBootstrap serverBootstrap = new ServerBootstrap();
		// 创建两个线程池
		// 简单来讲,就是boss监听端口,worker来监听selector(NIO里面的)
		ExecutorService boss = Executors.newCachedThreadPool();
		ExecutorService worker = Executors.newCachedThreadPool();
		// 设置工厂,并且把两个线程池加入进去
		// 经测试,该方法在netyy3.0中有效,5.0中没有
		serverBootstrap.setFactory(new NioServerSocketChannelFactory(boss,
				worker));
		// 设置管道工厂
		serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {

			@Override
			public ChannelPipeline getPipeline() throws Exception {

				ChannelPipeline channelPipeline = Channels.pipeline();
				// 加上此行代码,在Handler中便可以直接获取字符串,而不用经过ChannelBuffer了
				// 看源码可得,decoder用来处理上行数据
				channelPipeline.addLast("decoder", new StringDecoder());
				// encoder用来数据下行数据
				channelPipeline.addLast("encoder", new StringEncoder());
				/**
				 * 经测试可得,decoder和encoder不能省去,而下面的可以省掉
				 */
				channelPipeline.addLast("helloHandler", new ServerHandler());
				// 返回
				return channelPipeline;
			}
		});

		// 注意此行代码,在绑定时,一定要在工厂之后,否则就会报错
		serverBootstrap.bind(new InetSocketAddress(9090));
		System.out.println("start --> server");

	}
}

class ServerHandler extends SimpleChannelHandler {

	/**
	 * 不管是否已经连接,都将执行
	 */
	@Override
	public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		super.channelClosed(ctx, e);
		System.out.println("channelClosed");
	}

	/**
	 * 当网络连接时执行
	 */
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		super.channelConnected(ctx, e);
		System.out.println("channelConnected");
	}

	/**
	 * 只有当网络连接过,断开时才会执行
	 */
	@Override
	public void channelDisconnected(ChannelHandlerContext ctx,
			ChannelStateEvent e) throws Exception {
		super.channelDisconnected(ctx, e);
		System.out.println("channelDisconnected");
	}

	/**
	 * 捕获异常
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
			throws Exception {
		super.exceptionCaught(ctx, e);
		System.out.println("exceptionCaught");
	}

	/**
	 * 接收消息
	 */
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		super.messageReceived(ctx, e);
		System.out.println("messageReceived");
		// 因为在设置管道工厂时,设置了StringDecode,所以在此时可以直接获得
		// 但如果没有设置的话,可以通过以下方法
		// ChannelBuffer message = (ChannelBuffer) e.getMessage();
		// System.out.println(new String(message.array()));

		System.out.println(e.getMessage());

		/*
		 * 发送消息
		 */
		// ChannelBuffer copiedBuffer = ChannelBuffers.copiedBuffer("hi"
		// .getBytes());
		// ctx.getChannel().write(copiedBuffer);

		// 因为在管道中设置了encoder,所以可以像读取一样,写成下面的形式
		ctx.getChannel().write("hi");
	}

}

 

 

2、客户端的编写

package com.netty.hiclient;

import java.net.InetSocketAddress;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;

/**
 * @author Chalmers 2016年2月18日 下午10:22:08
 */
public class NettyClient {

	private static ClientBootstrap clientBootstrap;

	public static void main(String[] args) {
		// 获得客户端对象
		clientBootstrap = new ClientBootstrap();

		// 创建两个线程池
		ExecutorService boss = Executors.newCachedThreadPool();
		ExecutorService worker = Executors.newCachedThreadPool();

		// 设置工厂,跟服务端一样
		clientBootstrap.setFactory(new NioClientSocketChannelFactory(boss,
				worker));
		// 设置管道工厂
		clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {

			@Override
			public ChannelPipeline getPipeline() throws Exception {
				ChannelPipeline channelPipeline = Channels.pipeline();
				// 进行包装
				channelPipeline.addLast("decoder", new StringDecoder());
				channelPipeline.addLast("encoder", new StringEncoder());
				channelPipeline.addLast("hiHandler", new ClientHandler());
				return channelPipeline;
			}
		});

		System.out.println("start --> client");
		// 一定记住,这个地方用的是connect,而不是bind
		ChannelFuture channelFuture = clientBootstrap
				.connect(new InetSocketAddress("127.0.0.1", 9090));
		// 可以冲future中获得channel
		Channel channel = channelFuture.getChannel();
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.print("输入: ");
			// 用获得channel进行输出
			channel.write(sc.next());
		}
	}
}

class ClientHandler extends SimpleChannelHandler {

	@Override
	public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		super.channelClosed(ctx, e);
		System.out.println("channelClosed");
	}

	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		super.channelConnected(ctx, e);
		System.out.println("channelConnected");
	}

	@Override
	public void channelDisconnected(ChannelHandlerContext ctx,
			ChannelStateEvent e) throws Exception {
		super.channelDisconnected(ctx, e);
		System.out.println("channelDisconnected");
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
			throws Exception {
		super.exceptionCaught(ctx, e);
		System.out.println("exceptionCaught");
	}

	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		super.messageReceived(ctx, e);
		System.out.println("messageReceived");
		System.out.println(e.getMessage());
	}

}

 

2
2
分享到:
评论
1 楼 qq_24665727 2016-02-25  
厉害!

相关推荐

    java应用netty服务端和客户端

    在"java应用netty服务端和客户端"的示例中,Netty被用来构建一个简单的通信系统,其中包含服务端(Server)和客户端(Client)。为了实现通信,服务端和客户端都需要定义自己的`model对象`,这些对象通常包含了数据...

    netty文件传输服务端与客户端以及协议说明

    通过netty编写文件传输的客户端与服务端,以及协议说明, 通用的netty传输协议 通过该协议进行文件传输 文件传输客户端与服务端 可以根据文件的最后更新时间来增量传输文件 源码开放,通过eclipse或者idea导入代码...

    netty实现服务端与客户端通信

    在本文中,我们将深入探讨如何使用 Netty 实现服务端与客户端之间的通信,以及涉及到的关键知识点。 首先,我们要理解 Netty 的核心概念。Netty 基于非阻塞 I/O 模型,利用 Java NIO(Non-blocking Input/Output)...

    netty5服务端和客户端通讯的demo

    在这个“netty5服务端和客户端通讯的demo”中,我们将深入探讨如何利用Netty 5实现Java中的服务器和客户端通信。Netty 5(尽管现在Netty已经更新到更高级别的版本)提供了丰富的功能,包括NIO(非阻塞I/O)支持,...

    Netty实现Java服务端和C#客户端联通

    标题中的“Netty实现Java服务端和C#客户端联通”是指使用Netty作为Java服务器框架,与C#客户端(使用DotNetty库)进行通信的一种技术实现。这涉及到跨平台的网络通信,以及两个不同编程语言间的交互。 Netty是Java...

    springboot整合netty,分客户端和服务端两个项目

    springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目

    使用Netty搭建服务端和客户端过程详解

    使用Netty搭建服务端和客户端过程详解 Netty是当前Java领域中最流行的网络编程框架之一,它提供了一个简洁、灵活、可扩展的架构,可以轻松地构建高性能的网络应用程序。在本篇文章中,我们将详细介绍使用Netty搭建...

    Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码.rar

    Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码

    基于netty+mqtt3.1.1+springboot+jdk8 实现的 mqtt 服务端跟客户端

    #### 已实现: * 发布订阅功能 * 遗言通知 * 会话session数据 * 发布保留消息 * 主题过滤(/test 会接受到 /test/yy 的主题消息) * 实现标准的 qos0 qos1 qos2消息确认机制 * ssl加密 * 支持ws协议 ...

    基于Java的netty-mqtt MQTT 3.1.1协议服务端与客户端设计源码

    netty-mqtt是一个基于Java开发的MQTT 3.1.1协议服务端与客户端,包含113个文件,其中包括87个Java源文件、8个XML文件、7个Iml文件、3个YAML文件、3个JKS文件、2个Factories文件、1个LICENSE文件和1个Markdown文件。...

    Netty服务端和客户端调用demo

    Netty服务端和客户端调用demo是一个基于Spring Boot和Maven构建的应用,它演示了如何使用Netty框架进行网络通信。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的Java应用。这个demo...

    Android使用Netty网络框架实践(客户端、服务端)

    本实践将详细介绍如何在Android环境中使用Netty进行客户端和服务端的通信。 首先,我们需要理解Netty的基本概念。Netty的核心是其EventLoopGroup(事件循环组),它负责处理I/O事件,并将它们分发到相应的...

    Netty实现简单的客户端服务端通信示例

    在本文中,我们将深入探讨如何使用 Netty 实现简单的客户端-服务端通信,这对于初学者来说是一个很好的起点。 首先,理解 Netty 的核心概念至关重要。Netty 的设计基于 NIO(非阻塞 I/O),它利用了 Java 提供的 ...

    netty服务端、客户端代码

    在本文中,我们将深入探讨Netty的基本概念、如何创建Netty服务端和客户端,以及与SpringBoot的集成。 首先,Netty的核心设计理念是基于NIO(非阻塞I/O)和Reactor模式,这种模式可以有效地处理大量并发连接,减少了...

    基于netty实现的mqtt客户端,可用于Java、Android环境.zip

    《基于Netty实现的MQTT客户端在Java与Android环境中的应用》 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息协议,广泛应用于物联网(IoT)领域,尤其是资源受限的设备之间。在本文中...

    netty框架,服务端、客户端代码示例

    在这个"Netty框架,服务端、客户端代码示例"中,我们将深入探讨如何使用Netty构建服务端和客户端的通信。 首先,让我们了解Netty的基本架构。Netty的核心是它的“线程模型”和“通道”概念。线程模型采用“事件循环...

    物联网netty服务端和客户端两个项目

    本项目包含两个关键部分:Netty服务端和客户端,它们共同构建了一个稳定且可靠的通信架构。 Netty服务端: 1. **多设备连接管理**:服务端设计为能够同时处理多个设备的连接请求,通过非阻塞I/O(NIO)机制,提高...

    netty4服务端客户端实例

    在本文中,我们将深入探讨如何利用Netty 4构建一个简单的服务端和客户端实例,以及如何在IntelliJ IDEA 2018.1.3这个强大的Java开发环境中设置和运行这些实例。 首先,Netty 4相较于之前的版本,引入了更多的性能...

    netty服务端及客户端,支持HTTP和WEBSOCKET和SSL

    自己基于netty开发的服务端,支持spring配置服务器启动模式:http,websocket,ssl等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用服务器,内...

    netty客户端和服务端通讯

    在本项目中,"netty客户端和服务端通讯" 实现了基于 Netty 的通信机制,允许客户端与服务端进行高效的数据交互。 首先,让我们深入了解 Netty 的核心概念: 1. **ByteBuf**:Netty 提供了 ByteBuf 作为字节缓冲区...

Global site tag (gtag.js) - Google Analytics