1. 程式人生 > >Netty實戰-物件編解碼,Netty物件網路傳遞

Netty實戰-物件編解碼,Netty物件網路傳遞

書籍推薦:

  1. Server端程式碼
    <span style="font-size:12px;">/**
     * 
     * <p>
     * 	Netty Server Simple
     * </p>
     * 
     * LineBasedFrameDecoder + 訊息中得換行符
     * 	
     * @author 卓軒
     * @建立時間:2014年7月7日
     * @version: V1.0
     */
    
    public class NettyServer {
    	
    	private final int port = 8989;
    	
    	@Test
    	public void nettyServer(){
    		
    		EventLoopGroup bossGroup = new NioEventLoopGroup();
    		EventLoopGroup workerGroup = new NioEventLoopGroup();
    		
    		try {
    			ServerBootstrap serverBootstrap = new ServerBootstrap();
    			serverBootstrap.group(bossGroup,workerGroup)
    				.channel(NioServerSocketChannel.class)
    				.option(ChannelOption.SO_BACKLOG, 1024)
    				.childHandler(new ChildChannelHandler());
    			
    			//繫結埠、同步等待
    			ChannelFuture futrue = serverBootstrap.bind(port).sync();
    			
    			//等待服務監聽埠關閉
    			futrue.channel().closeFuture().sync();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			//退出,釋放執行緒等相關資源
    			bossGroup.shutdownGracefully();
    			workerGroup.shutdownGracefully();
    		}
    
    		
    	}
    
    	private class ChildChannelHandler extends ChannelInitializer<SocketChannel>{
    		@Override
    		protected void initChannel(SocketChannel ch) throws Exception {
    			//ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
    //			
    //			ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes());
    //			ch.pipeline().addLast(new DelimiterBasedFrameDecoder(2048, delimiter));
    //			
    			//ch.pipeline().addLast(new FixedLengthFrameDecoder(20));
    			ch.pipeline().addLast(new ObjectDecoder(1024*1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
    			ch.pipeline().addLast(new ObjectEncoder());
    			ch.pipeline().addLast(new StringDecoder());
    			ch.pipeline().addLast(new UserRespServerHandler());
    		}
    	}
    	
    	
    }</span>
  2. Client端程式碼
    <span style="font-size:12px;">/**
     * 
     * <p>
     * 	NettyClient  實現
     * </p>
     * 
     * @author 卓軒
     * @建立時間:2014年7月7日
     * @version: V1.0
     */
    public class NettyClient {
    
    	
    	
    	public void connect(int port,String host){
    		
    		EventLoopGroup group = new NioEventLoopGroup();
    		
    		try {
    			Bootstrap bootstrap = new Bootstrap();
    			bootstrap.group(group)
    			.channel(NioSocketChannel.class)
    			.option(ChannelOption.TCP_NODELAY, true)
    			.handler(new ChannelInitializer<SocketChannel>() {
    
    				@Override
    				protected void initChannel(SocketChannel ch) throws Exception {
    					
    					ch.pipeline().addLast(new ObjectDecoder(1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
    					ch.pipeline().addLast(new ObjectEncoder());
    					
    					ch.pipeline().addLast(new StringDecoder());
    					ch.pipeline().addLast(new UserQueryClientHandler());
    				}
    			});
    			//發起非同步連結操作
    			ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
    			
    			channelFuture.channel().closeFuture().sync();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			//關閉,釋放執行緒資源
    			group.shutdownGracefully();
    		}
    	}	
    	@Test
    	public void nettyClient(){
    		
    		new NettyClient().connect(8989, "localhost");
    	}
    }</span>
  3. ServerHander 程式碼
    <span style="font-size:12px;">/**
     * 
     * <p>
     *  使用者查詢返回
     * </p>
     * 
     * @author 卓軒
     * @建立時間:2014年7月7日
     * @version: V1.0
     */
    public class UserRespServerHandler extends ChannelInboundHandlerAdapter {
    
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		
    		UserQuery userQuery = (UserQuery) msg;
    		
    		System.out.println("收到來自客戶端的查詢請求:"+ String.valueOf(userQuery));
    		
    		if(userQuery != null && userQuery.getUserId()!= 0){
    			UserDO userDO = getUserById(userQuery.getUserId());
    			ctx.writeAndFlush(userDO);
    		}
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		
    		System.out.println("Server has Exception,"+ cause.getCause());
    	
    	}
    	
    	
    	private UserDO getUserById(int userId){
    		
    		if(userId % 2 == 0){
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(userId);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("卓軒");
    			zhuoxuan.setUnick("zhuoxuan");
    			zhuoxuan.setEmail("
    [email protected]
    "); return zhuoxuan; }else{ UserDO zhuoxuan = new UserDO(); zhuoxuan.setUserId(userId); zhuoxuan.setSex(1); zhuoxuan.setUname("張三"); zhuoxuan.setUnick("zhangsan"); zhuoxuan.setEmail("[email protected]"); return zhuoxuan; } } }</span><strong style="font-size: 14px;"> </strong>

  4. ClientHander 程式碼
<span style="font-size:12px;">/**
 * 
 * <p>
 * 使用者查詢請求 Handler
 * </p>
 * 
 * @author 卓軒
 * @建立時間:2014年7月7日
 * @version: V1.0
 */
public class UserQueryClientHandler extends ChannelInboundHandlerAdapter {
	
	

	public UserQueryClientHandler() {
		
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		
		for (int i = 0; i < 100; i++) {
			UserQuery userQuery = new UserQuery();
			userQuery.setUserId(1001+i);
			ctx.write(userQuery);
		}
		ctx.flush();
		
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		
		String message = String.valueOf(msg);
		
		System.out.println("Netty-Client:Receive Message,"+ message);
	}
	
	

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		ctx.flush();
	}
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

		System.out.println("Client has Exception,"+ cause.getCause());
	}
}</span>

相關推薦

Netty實戰-物件解碼Netty物件網路傳遞

書籍推薦: Server端程式碼<span style="font-size:12px;">/** * * <p> * Netty Server Simple * </p> * * LineBasedFrameD

Netty protobuf的解碼使用

Netty為protobuf提供了兩個編碼器(ProtobufEncoder,ProtobufVarint32LengthFieldPrepender),兩個解碼器(ProtobufVarint32FrameDecoder,ProtobufDecoder)。 只需要在chi

Netty開發redis客戶端Netty傳送redis命令netty解析redis訊息

Netty開發redis客戶端,Netty傳送redis命令,netty解析redis訊息, netty redis ,redis RESP協議。redis客戶端,netty redis協議 我們可以使用redis-cli這個客戶端來操作redis,也可以使用window的命令列telnet連線redis。

區塊鏈錢包助記詞生成解碼認證

助記詞是分層錢包中重要的概念之一,比特幣BIP39是一套助記詞庫,比特幣BIP39的JavaScript實現,用於生成確定性金鑰的助記符程式碼。 一.助記詞生成 生成12個助記詞 var bip39 = require('bip39') var mnemonic = bip3

Netty實戰》 (一) ---------------------Netty 初探

在深入Netty 之前我們先從BIO 到 NIO的演變入手 ServerSocket serverSocket = new ServerSocket(54132); Socket socket = serverSocket.accept(); //TODO 上述程式

Tensorflow常見問題處理 TensorFlow 影象預處理(一) 影象解碼影象尺寸調整 tensorflow(一):圖片處理 TensorFlow 處理圖片

1、Tensorflow中影象處理函式(影象大小調整)   Tensorflow中影象處理函式(影象大小調整)   tensorflow入門之---------影象大小調整   TensorFlow 影象預處理(一) 影象編解碼,影象尺寸調整   Tensorflow針對不定尺寸的圖片讀寫tfreco

物件List集合物件的某一屬性排序

物件List集合排序 核心程式碼塊 Collections.sort(eList , new Comparator<E>() { public int co

Netty實戰(1)使用Netty搭建一個簡單的客戶端與伺服器的互動Demo

       Netty 是一個基於 JAVA NIO 類庫的非同步通訊框架,它的架構特點是:非同步非阻塞、基於事件驅動、高效能、高可靠性和高可定製性。換句話說,Netty是一個NIO框架,使用它可以簡單快速地開發網路應用程式,比如客戶端和服務端的協議。Netty大大簡化了網

java中氣泡排序根據物件的屬性物件

主程式排序: public class TestDmo { public static void main(String[] args) { List list=getData();

2017.11.1開始學習FFMPEG音視訊解碼通過學習雷霄驊文章

NAL Header由三部分組成:forbidden_bit,nal_reference_bit(優先順序)2bit,nal_unit_type(型別)5bit。 補充一下NAL_HEADER裡的nal_unit_type一位元組的型別有哪些: 0:未規定      

判斷兩個物件是否相同判斷物件陣列中是否含有某個物件

var json1 = { addroleData: [{ key:1, label:'一' },{

netty使用jboss的Marshalling解碼(物件序列化)

36套java進階高階架構師視訊+38套大資料視訊  保證全是硬貨需要的+微信:du13797566440首選映入netty-all-5.0.0.Alpha2.jar  jboss-marshalling-serial-1.3.0.CR9.jar  jboss-marshal

分散式之Netty介紹與實戰(四)--Netty解碼程式設計實戰

目錄 分散式之Netty介紹與實戰(一)–Java IO與NIO 分散式之Netty介紹與實戰(二)–Netty程式設計實踐 分散式之Netty介紹與實戰(三)–Netty執行緒模型解析 分散式之Netty介紹與實戰(四)–Netty編解碼程式設計實戰

高性能網絡服務器程:為什麽linux下epoll是最好Netty要比NIO.2好?

系統 工作效率 lee socket 為我 handler 10g 函數 適合 基本的IO編程過程(包括網絡IO和文件IO)是,打開文件描述符(windows是handler,java是stream或channel),多路捕獲(Multiplexe,即select和poll

Java NIO框架Netty教程(九) Object對象/解碼

log writer arr num context 不兼容 是的 pat .html 看到題目,有的同學可能會想,上回不是說過對象傳遞了嗎?是的,只是在Java NIO框架Netty教程(八) Object對象傳遞中,我們只是介紹如何使用Netty提供的編/解碼工具,完成

Netty 解碼技術 數據通信和心跳監控案例

base encode lean java語言 附件 rep baidu 類比 syn Netty 編解碼技術 數據通信和心跳監控案例 多臺服務器之間在進行跨進程服務調用時,需要使用特定的編解碼技術,對需要進行網絡傳輸的對象做編碼和解碼操作,以便完成遠程調用。Netty提供

開發基於protostuff解碼技術的Netty程序:傳輸pojo對象

tcp ons blog 1.3 object類 end 換來 序列化 ray [toc] 開發基於protostuff編解碼技術的Netty程序:傳輸pojo對象 前言 這次開發的Netty程序主要是在網絡中傳輸Java對象,傳輸的對象不僅限於字符串,也可以是自定義的其

netty權威指南學習筆記六——解碼技術之MessagePack

ssi add java exception 字節數組 ted evel thrift 發送   編解碼技術主要應用在網絡傳輸中,將對象比如BOJO進行編解碼以利於網絡中進行傳輸。平常我們也會將編解碼說成是序列化/反序列化   定義:當進行遠程跨進程服務調用時,需要把被傳輸

Android 基於Netty的訊息推送方案之物件傳遞(四)

在上一篇文章中《Android 基於Netty的訊息推送方案之字串的接收和傳送(三)》我們介紹了Netty的字串傳遞,我們知道了Netty的訊息傳遞都是基於流,通過ChannelBuffer傳遞的,那麼自然,Object也需要轉換成ChannelBuffer來傳遞。好在Netty本身已經給我們寫好了

netty使用msgpack自定義解碼器實現序列化操作

匯入依賴 <dependency> <groupId>org.msgpack</groupId> <artifactId>msgpack</artifactId>