最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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應用程序,在這里我們要注意服務端和客戶端之間的兩個類類名和包名在兩端要完全相同。

總結

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

您可能感興趣的文章:

相關文章

  • Mybatis中and和循環(huán)or混用操作(or轉換成in)

    Mybatis中and和循環(huán)or混用操作(or轉換成in)

    這篇文章主要介紹了Mybatis中and和循環(huán)or混用操作(or轉換成in),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 在SpringBoot 中從application.yml中獲取自定義常量方式

    在SpringBoot 中從application.yml中獲取自定義常量方式

    這篇文章主要介紹了在SpringBoot 中從application.yml中獲取自定義常量方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 使用IntelliJ IDEA 15和Maven創(chuàng)建Java Web項目(圖文)

    使用IntelliJ IDEA 15和Maven創(chuàng)建Java Web項目(圖文)

    本篇文章主要介紹了使用IntelliJ IDEA 15和Maven創(chuàng)建Java Web項目(圖文),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Springboot實現Excel批量導入數據并保存到本地

    Springboot實現Excel批量導入數據并保存到本地

    這篇文章主要為大家詳細介紹了Springboot實現Excel批量導入數據并將文件保存到本地效果的方法,文中的示例代講解詳細,需要的可以參考一下
    2022-09-09
  • Java中內存分配的幾種方法

    Java中內存分配的幾種方法

    本文主要介紹Java中幾種分配內存的方法。我們會看到如何使用sun.misc.Unsafe來統(tǒng)一操作任意類型的內存。以前用C語言開發(fā)的同學通常都希望能在Java中通過較底層的接口來操作內存,他們一定會對本文中要講的內容感興趣
    2014-03-03
  • Java中語音url轉換成InputStream的示例代碼

    Java中語音url轉換成InputStream的示例代碼

    在Java中,可以使用java.net.URL和java.net.URLConnection類來將語音URL轉換為InputStream,本文通過示例代碼介紹Java中語音url轉換成InputStream的相關知識,感興趣的朋友一起看看吧
    2024-01-01
  • Java中枚舉的使用詳解

    Java中枚舉的使用詳解

    這篇文章主要介紹了Java中枚舉的使用詳解的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 實例分析java對象的序列化和反序列化

    實例分析java對象的序列化和反序列化

    序列化 (Serialization)是將對象的狀態(tài)信息轉換為可以存儲或傳輸的形式的過程。一般將一個對象存儲至一個儲存媒介,例如檔案或是記億體緩沖等。在網絡傳輸過程中,可以是字節(jié)或是XML等格式。而字節(jié)的或XML編碼格式可以還原完全相等的對象。這個相反的過程又稱為反序列化
    2018-09-09
  • Java判斷線程池線程是否執(zhí)行完畢

    Java判斷線程池線程是否執(zhí)行完畢

    這篇文章主要介紹了Java判斷線程池線程是否執(zhí)行完畢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java內存模型及其作用詳解

    Java內存模型及其作用詳解

    在現代計算機系統(tǒng)中,尤其是多處理器架構下,每個處理器都有自己的高速緩存,而主內存(RAM)是所有處理器共享的數據存儲區(qū)域,這篇文章主要介紹了深入理解Java內存模型及其作用,需要的朋友可以參考下
    2024-04-04

最新評論

永年县| 高邮市| 资兴市| 屏东县| 邓州市| 达日县| 阳西县| 新和县| 余姚市| 蓬安县| 鄂温| 东港市| 山阳县| 三明市| 神农架林区| 襄垣县| 永吉县| 汉川市| 株洲市| 遂宁市| 台北市| 杭锦旗| 阳新县| 沁阳市| 宁都县| 晋江市| 磐石市| 和林格尔县| 唐河县| 衢州市| 共和县| 贞丰县| 连江县| 大港区| 武隆县| 咸宁市| 永年县| 金山区| 林州市| 衡山县| 德保县|