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()方法。
現在可以啓動服務端與客戶端,來查看你的控制檯了~