Netty實戰-物件編解碼,Netty物件網路傳遞
- 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>
- 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>
- 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("
- 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>