欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Netty學習教程之Netty與Marshalling結合發(fā)送對象

 更新時間:2017年05月21日 09:23:14   作者:荒野的塵埃  
Netty是由JBOSS提供的一個Java開源框架,之前已經給大家簡單介紹了一些基礎與使用,下面這篇文章主要給大家介紹了關于Netty與Marshalling結合發(fā)送對象的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

之前的一篇文章是Netty簡單的學習,我們可以傳遞一個字符串,那么如果我們想要在Netty中傳遞一個對象該怎么辦呢 ?

那么這個時候我們可以結合Marshalling來傳遞。

方法如下:

首先需要導入兩個Marshalling的依賴包

jboss-marshalling-1.3.0.CR9.jar
jboss-marshalling-serial-1.3.0.CR9.jar

注意:我開始學習的時候只導入了第一個jar包,沒有導入第二個,結果是不報錯,但是客戶端和服務端之間傳遞不了消息。所以兩個包一定要都導入才行。

MarshallingCodeCFactory工具類

public class MarshallingCodeCFactory { 
 
 public static MarshallingDecoder buildMarshallingDecoder() { 
  final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial"); 
  final MarshallingConfiguration configuration = new MarshallingConfiguration(); 
  configuration.setVersion(5); 
  UnmarshallerProvider provider = new DefaultUnmarshallerProvider(factory, configuration); 
  MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024*1024); 
  return decoder; 
 } 
 
 public static MarshallingEncoder buildMarshallingEncoder() { 
  final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial"); 
  final MarshallingConfiguration configuration = new MarshallingConfiguration(); 
  configuration.setVersion(5); 
  MarshallerProvider provider = new DefaultMarshallerProvider(factory, configuration); 
  MarshallingEncoder encoder = new MarshallingEncoder(provider); 
  return encoder; 
 } 
} 

server端

public class Server { 
  
 public static void main(String[] args) throws InterruptedException { 
  //1.第一個線程組是用于接收Client端連接的 
  EventLoopGroup bossGroup = new NioEventLoopGroup();  
  //2.第二個線程組是用于實際的業(yè)務處理的 
  EventLoopGroup workerGroup = new NioEventLoopGroup(); 
  ServerBootstrap b = new ServerBootstrap(); 
  b.group(bossGroup, workerGroup);//綁定兩個線程池 
  b.channel(NioServerSocketChannel.class);//指定NIO的模式,如果是客戶端就是NioSocketChannel 
  b.option(ChannelOption.SO_BACKLOG, 1024);//TCP的緩沖區(qū)設置 
  b.option(ChannelOption.SO_SNDBUF, 32*1024);//設置發(fā)送緩沖的大小 
  b.option(ChannelOption.SO_RCVBUF, 32*1024);//設置接收緩沖區(qū)大小 
  b.option(ChannelOption.SO_KEEPALIVE, true);//保持連續(xù) 
  b.childHandler(new ChannelInitializer<SocketChannel>() { 
   protected void initChannel(SocketChannel ch) throws Exception { 
    //設置Marshalling的編碼和解碼 
    ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder()); 
    ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder()); 
    ch.pipeline().addLast(new ServertHandler()); 
   } 
  }); 
  ChannelFuture future = b.bind(8765).sync();//綁定端口 
  future.channel().closeFuture().sync();//等待關閉(程序阻塞在這里等待客戶端請求) 
  bossGroup.shutdownGracefully();//關閉線程 
  workerGroup.shutdownGracefully();//關閉線程 
 } 
 
} 

ServerHandler處理類

public class ServertHandler extends ChannelHandlerAdapter { 
 
 @Override 
 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
   throws Exception { 
  cause.printStackTrace(); 
 } 
 
 @Override 
 public void channelRead(ChannelHandlerContext ctx, Object msg) 
   throws Exception { 
  Send send = (Send) msg; 
  System.out.println("client發(fā)送:"+send); 
   
  Receive receive = new Receive(); 
  receive.setId(send.getId()); 
  receive.setMessage(send.getMessage()); 
  receive.setName(send.getName()); 
  ctx.writeAndFlush(receive); 
 } 
  
} 

由于我們已經在Server端和Client端定義了傳遞的類型又Marshalling工廠處理,所以此時我們接收的時候直接轉成發(fā)送的對象類型就行了。

Client端

public class Client { 
 
 public static void main(String[] args) throws InterruptedException { 
  EventLoopGroup worker = new NioEventLoopGroup(); 
  Bootstrap b = new Bootstrap(); 
  b.group(worker) 
  .channel(NioSocketChannel.class) 
  .handler(new ChannelInitializer<SocketChannel>() { 
   @Override 
   protected void initChannel(SocketChannel sc) throws Exception { 
    //ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes()); 
    //sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,buf)); 
    //sc.pipeline().addLast(new StringDecoder()); 
    sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder()); 
    sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder()); 
    sc.pipeline().addLast(new ClientHandler()); 
   } 
  }); 
  ChannelFuture f=b.connect("127.0.0.1",8765).sync(); 
  for(int i=1;i<=5;i++){ 
   Send send = new Send(); 
   send.setId(i); 
   send.setMessage("message"+i); 
   send.setName("name"+i); 
   f.channel().writeAndFlush(send); 
  } 
  f.channel().closeFuture().sync(); 
  worker.shutdownGracefully(); 
 } 
} 

ClientHandler端

public class ClientHandler extends ChannelHandlerAdapter{ 
  @Override 
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
    throws Exception { 
   cause.printStackTrace(); 
   ctx.close(); 
  } 
 
  @Override 
  public void channelRead(ChannelHandlerContext ctx, Object msg) 
    throws Exception { 
   Receive receive = (Receive) msg; 
   System.out.println("server反饋:"+receive); 
  } 
} 

send類

public class Send implements Serializable { 
 
 /** 
  * serialVersionUID:TODO(用一句話描述這個變量表示什么) 
  * 
  * @since 1.0.0 
  */ 
 
 private static final long serialVersionUID = 1L; 
 
 private Integer id; 
 private String name; 
 private String message; 
 
 public Integer getId() { 
  return id; 
 } 
 
 public void setId(Integer id) { 
  this.id = id; 
 } 
 
 public String getName() { 
  return name; 
 } 
 
 public void setName(String name) { 
  this.name = name; 
 } 
 
 public String getMessage() { 
  return message; 
 } 
 
 public void setMessage(String message) { 
  this.message = message; 
 } 
 
 @Override 
 public String toString() { 
  return "Send [id=" + id + ", name=" + name + ", message=" + message + "]"; 
 } 
 
} 

Receive類

public class Receive implements Serializable{ 
 
 /** 
  * serialVersionUID:TODO(用一句話描述這個變量表示什么) 
  * @since 1.0.0 
  */ 
  
 private static final long serialVersionUID = 1L; 
 private Integer id; 
 private String name; 
 private String message; 
 private byte[] sss; 
  
 public byte[] getSss() { 
  return sss; 
 } 
 public void setSss(byte[] sss) { 
  this.sss = sss; 
 } 
 public Integer getId() { 
  return id; 
 } 
 public void setId(Integer id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public String getMessage() { 
  return message; 
 } 
 public void setMessage(String message) { 
  this.message = message; 
 } 
 @Override 
 public String toString() { 
  return "Receive [id=" + id + ", name=" + name + ", message=" + message + ", sss=" + Arrays.toString(sss) + "]"; 
 } 
  
} 

注意:send類和receive這兩個類,我們再真實環(huán)境開發(fā)的時候服務器和客戶端往往是兩個web應用程序,在這里我們要注意服務端和客戶端之間的兩個類類名和包名在兩端要完全相同。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:

相關文章

  • Java的Struts2框架配合Ext JS處理JSON數據的使用示例

    Java的Struts2框架配合Ext JS處理JSON數據的使用示例

    這篇文章主要介紹了Java的Struts2框架配合Ext JS處理JSON數據的使用示例,包括將Ext JS中的JSON數據解析為列表的方法,需要的朋友可以參考下
    2016-03-03
  • JAVA多線程并發(fā)下的單例模式應用

    JAVA多線程并發(fā)下的單例模式應用

    單例模式應該是設計模式中比較簡單的一個,也是非常常見的,但是在多線程并發(fā)的環(huán)境下使用卻是不那么簡單了,今天給大家分享一個我在開發(fā)過程中遇到的單例模式的應用。
    2017-03-03
  • 詳解SpringBoot Controller接收參數的幾種常用方式

    詳解SpringBoot Controller接收參數的幾種常用方式

    這篇文章主要介紹了詳解SpringBoot Controller接收參數的幾種常用方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Spring Cloud Stream簡單用法

    Spring Cloud Stream簡單用法

    Spring cloud stream是為構建微服務消息驅動而產生的一種框架。Spring Cloud Stream基于Spring boot的基礎上,可創(chuàng)建獨立的、生產級別的Spring應用,并采用Spring Integration來連接消息中間件提供消息事件驅動,一起看看吧
    2021-07-07
  • Spring生命周期回調與容器擴展詳解

    Spring生命周期回調與容器擴展詳解

    這篇文章主要介紹了Spring生命周期回調與容器擴展詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java下載指定文件并返回給前端返回流文件的實現步驟

    java下載指定文件并返回給前端返回流文件的實現步驟

    在Java中我們可以根據文件地址返回一個文件流,以便對文件進行讀取、寫入等操作,下面這篇文章主要給大家介紹了關于java下載指定文件并返回給前端返回流文件的實現步驟,需要的朋友可以參考下
    2024-03-03
  • Netty中ChannelPoolHandler調用處理程序詳解

    Netty中ChannelPoolHandler調用處理程序詳解

    這篇文章主要介紹了Netty中ChannelPoolHandler調用處理程序詳解,Netty 是基于 Java NIO 的異步事件驅動的網絡應用框架,使用 Netty 可以快速開發(fā)網絡應用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下
    2023-11-11
  • Spring中@RequestParam使用及遇到的一些坑

    Spring中@RequestParam使用及遇到的一些坑

    @RequestParam 主要用于將請求參數區(qū)域的數據映射到控制層方法的參數上,下面這篇文章主要給大家介紹了關于Spring中@RequestParam使用及遇到的一些坑,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 使用IDEA搭建SSM框架的詳細教程(spring + springMVC +MyBatis)

    使用IDEA搭建SSM框架的詳細教程(spring + springMVC +MyBatis)

    這篇文章主要介紹了使用IDEA搭建SSM框架的詳細教程 spring + springMVC +MyBatis,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Spring Cloud Hystrix 服務容錯保護的原理實現

    Spring Cloud Hystrix 服務容錯保護的原理實現

    這篇文章主要介紹了Spring Cloud Hystrix 服務容錯保護的原理實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論