Netty 客戶端與服務端雙向通信

2016年,拍攝於臺灣省墾丁,這就是太平洋了,風太大了我這個噸位幾乎站不住。

 微信公衆號

王皓的GitHub:https://github.com/TenaciousDWang

     

現在我們已經學會了如何啓動一個Netty的客戶端與服務端,接下來,我們來讓他倆雙向通訊。

客戶端發送數據

      首先,我們看一下引導類.handler這個位置,之前我們說過這個地方是用來添加IO處理邏輯的,現在我們可以在initChannel這個方法中爲我們的SocketChannel添加Logic,ch.pipeline()方法會返回一個ChannelPipeline對象,是一個邏輯處理鏈,採用責任鏈模式,然後我們使用addLast()方法,爲服務端添加處理邏輯new ClientHandler()。

      

接下來,來實現這個handler,首先我們繼承ChannelInboundHandlerAdapter,覆寫channelActive()方法,這個方法會在連接建立時調用:

      從ChannelHandlerContext中獲取一個ByteBuf(Netty數據傳輸的載體,與以往的socket編程不同,Netty的數據載體是以ByteBuf爲單位的,以後會詳細說一下),將要發送的數據寫入到載體中,最後將ByteBuf放入管道發出。

服務端讀取客戶端送來的數據

       跟客戶端差不多,我們同樣給NettyServer.java服務端中邏輯處理鏈添加邏輯處理器:

       接下來,我們來實現讀取客戶端數據的Handler:

       同樣是繼承ChannelInboundHandlerAdapter類,然後我們覆寫channelRead()方法,這個方法在讀取到數據時,會回調,msg就是讀取到的數據,這裏我們可以強制轉換爲ByteBuf,將二進制數據轉爲UTF-8字符串,打印到控制檯。

服務端相應客戶端並返回數據

       同客戶端向服務端發送數據,從ChannelHandlerContext中獲取一個ByteBuf,填充數據後,經由ctx.channel().writeAndFlush(out);寫入數據。

      然後,我們讓客戶端來讀取服務端返回的響應,打印到控制檯上,跟服務端讀取數據一樣,我們來覆寫channelRead()方法。

        現在可以啓動服務端與客戶端,來查看你的控制檯了~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章