`
Everyday都不同
  • 浏览: 725250 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

利用Netty进行客户端和服务端交互的入门示例

阅读更多
Netty是基于事件驱动的、异步的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。是一种NIO框架,下面从最简单的Hello World示例开始,演示服务端和客户端交互进行Netty交互。

1.首先,创建服务端

public class DiscardServer {
	
	private int port;
	
	public DiscardServer(int port) {
		super();
		this.port = port;
	}
	
	public void run() {
		//配置Server
				ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
						Executors.newCachedThreadPool(),
						Executors.newCachedThreadPool()
				));
				
				//设置pipeFactory
				bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
					
					@Override
					public ChannelPipeline getPipeline() throws Exception {
						ChannelPipeline pipeline = Channels.pipeline(new DiscardServerHandler());
						return pipeline;
					}
				});
				
				//绑定server端端口
				bootstrap.bind(new InetSocketAddress(port));
	}

	public static void main(String[] args) {
		new DiscardServer(8080).run();
	}


	public int getPort() {
		return port;
	}


	public void setPort(int port) {
		this.port = port;
	}
	
	
}


2、创建服务端事件处理的站点Handler,里面包含回调方法用于处理与客户端交互时的操作。

class DiscardServerHandler extends SimpleChannelHandler {
	
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		System.out.println("--------服务端-------");
		String str = "Hello world, I'm server";
		ChannelBuffer buffer = ChannelBuffers.buffer(str.length());
		buffer.writeBytes(str.getBytes());
		e.getChannel().write(buffer);
	}
	
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
		System.out.println("服务端接收到消息:" + buffer.toString(Charset.defaultCharset()));
	}
	
}


3、创建客户端

public class TimeClient {
	
	 private String host;  
	 private int port; 
	
	public TimeClient(String host, int port) {
		super();
		this.host = host;
		this.port = port;
	}
	
	public void run() {
		ClientBootstrap bootstrap = new ClientBootstrap( 
				new NioClientSocketChannelFactory(
						Executors.newCachedThreadPool(),
						Executors.newCachedThreadPool()
				)
			);
			
			bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
				//ChannelPipeline 管道、传输途径
				@Override
				public ChannelPipeline getPipeline() throws Exception {
//					ChannelPipeline pipeline = Channels.pipeline();
//					pipeline.addLast("encode", new StringEncoder());
//					pipeline.addLast("decode", new StringDecoder());
//					pipeline.addLast("handler", new TimeClientHandler());
					return Channels.pipeline(new TimeClientHandler());
				}
			});
			
//			bootstrap.setOption("tcpNoDelay", true);
//			bootstrap.setOption("keepAlive", true);
			 // Start the connection attempt.  
			ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));  
			 
			// Wait until the connection is closed or the connection attempt fails.  
			future.getChannel().getCloseFuture().awaitUninterruptibly();  
		
			// Shut down thread pools to exit.  
			bootstrap.releaseExternalResources();  

	}


	public static void main(String[] args) {
		new TimeClient("127.0.0.1", 8080).run();
	}



	public String getHost() {
		return host;
	}



	public void setHost(String host) {
		this.host = host;
	}



	public int getPort() {
		return port;
	}



	public void setPort(int port) {
		this.port = port;
	}
	
	
	
}


4、创建客户端的Handler

class TimeClientHandler extends SimpleChannelHandler {
	
	//这个属于事件相关的处理
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		System.out.println("-----------客户端---------------");
		String msg = "Hello world, I'm client";
		ChannelBuffer buffer = ChannelBuffers.buffer(msg.length());
		buffer.writeBytes(msg.getBytes());
		e.getChannel().write(buffer);
	}
	
	 @Override  
	 public void messageReceived(  
	     ChannelHandlerContext ctx, MessageEvent e) {  
	 // Send back the received message to the remote peer.  
	 ChannelBuffer acceptBuff = (ChannelBuffer) e.getMessage();  
	 String info = acceptBuff.toString(Charset.defaultCharset());  
	 System.out.println("客户端接收到消息:" + info);  
	 e.getChannel().close();  
	 }  

	
}


5、先启动server端,再启动client端。可以分别在服务端和客户端的控制台看到如下消息:

server console:
--------服务端-------
服务端接收到消息:Hello world, I'm client

client console:
-----------客户端---------------
客户端接收到消息:Hello world, I'm server

6、注意在handler中,传递字符串必须以ChannelBuffer为载体,不能直接用String传递。
   当客户端和服务端连接上后,先回调的是channelConnected方法;之后才是messageReceived方法。
   至此,就完成了Netty客户端与服务端的简单交互!
分享到:
评论

相关推荐

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

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何使用 Netty 实现简单的客户端-服务端通信,这对于初学者来说是一个很好的起点。...

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

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

    netty3 客户端 服务端聊天

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty3 客户端 服务端聊天”的示例中,我们将探讨如何使用 Netty 3 实现客户端和服务端之间的长连接...

    java应用netty服务端和客户端

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

    netty客户端与服务器信息交互demo

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty客户端与服务器信息交互demo”中,我们将深入探讨Netty如何实现客户端和服务器之间的信息交换。...

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

    Netty是一个异步事件驱动的网络应用程序框架,它为高性能、高可用性的网络服务器和客户端提供了一种简单易用的方式。本实践将详细介绍如何在Android环境中使用Netty进行客户端和服务端的通信。 首先,我们需要理解...

    Netty3客户端服务端hi allen.zip

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本案例中,"Netty3客户端服务端hi allen.zip" 提供了一个基于 Netty 3 的简单客户端和服务端示例,旨在帮助...

    C# Netty 客户端,服务器端包含接双向接收

    尽管Netty本身是用Java编写的,但通过跨语言交互,C#也可以利用Netty进行网络通信。 在描述中提到的"自己研究出来并与大家分享"表明这可能是一个个人研究项目,作者愿意将他们的学习成果与社区共享。这通常意味着...

    NettyDemo包含客户端服务端

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本示例中,"NettyDemo" 提供了一个完整的解决方案,包括客户端和服务端的实现,适用于 Android 客户端和...

    netty 包含客户端和服务器端

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个压缩包包含的是 Netty 的一个实际应用示例,专注于客户端和服务器端的实现。以下是对这个“netty 包含...

    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输示例代码.rar

    在"HelloNetty"示例中,我们可以看到一个简单的服务端和客户端的创建过程,以及如何通过Netty进行数据交互。这个例子通常会包含创建EventLoopGroup、定义处理器、配置并启动ServerBootstrap或Bootstrap,以及在...

    websocket客户端和服务端

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在两个方向上同时传输,极大地提高了实时性。在Web应用程序中,WebSocket为开发者提供了低延迟、高效率的交互方式,...

    Netty5.rar

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 5 版本中的关键概念和特性,以及如何创建一个简单的客户端-服务器实例。 ...

    通过Netty实现MQTT服务端Demo

    Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于创建服务器和客户端的网络通信。而MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,常用于物联网(IoT)设备之间...

    scoket客户端 服务端.zip

    本示例提供了服务端和客户端的完整代码,非常适合初学者理解和实践Socket通信。 首先,我们来看看“Socket”。Socket是操作系统提供的一种进程间通信(IPC)机制,它允许两个网络上的应用进行数据交换。在TCP/IP...

    socket长连接,netty服务器与android源码

    Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty的核心是其NIO(非阻塞I/O)模型,它允许在一个线程中处理多个连接,大大提升了系统的并发能力。Netty...

    springMVC_netty.rar

    在SpringMVC和Netty集成中,TCP通信用于客户端和服务端之间的数据交换。客户端发送数据包,服务端接收并解析数据,然后执行相应的业务逻辑,如数据入库。 5. **客户端实现**:在本示例中,客户端包含了发送TCP...

    nettyproject:netty服务端,客户端开发,源码阅读

    在"nettyproject"中,我们可以看到针对Netty服务端和客户端的开发实例。NIO(Non-blocking I/O)编程是Netty的核心特性,它利用Java的NIO库实现了低延迟、高吞吐量的网络通信。NIO不同于传统的阻塞I/O模型,它允许一...

    netty基于protobuf的简单示例

    在本示例中,我们将深入探讨如何利用 Netty 和 Google 的 Protocol Buffers(protobuf)来构建一个简单的服务端和客户端通信系统。 Protocol Buffers 是 Google 提供的一种数据序列化协议,它可以将结构化数据序列...

Global site tag (gtag.js) - Google Analytics