`
Everyday都不同
  • 浏览: 714870 次
  • 性别: 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的同学有所帮助。

    Spring Boot集成netty实现客户端服务端交互示例详解

    主要给大家介绍了关于Spring Boot集成netty实现客户端服务端交互的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    JAVA上百实例源码以及开源项目源代码

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java资源包01

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    JAVA上百实例源码以及开源项目

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

Global site tag (gtag.js) - Google Analytics