Netty使用

一、Netty Server端

  • IDE和構(gòu)建工具:eclipse meaven
  • Netty版本號:5.0.0.Alpha2

1. 新建工程谎懦,通過meaven導(dǎo)入Netty的庫包

找到工程中的pom.xml文件,在dependencies中添加如下代碼

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>5.0.0.Alpha2</version>
</dependency>

2. 創(chuàng)建NettyServer

新建NettyServer類

package com.jiutianbian.NettyTest;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyServer {
    private int port;

    public NettyServer(int port) {
        this.port = port;
        bind();
    }

    private void bind() {
        EventLoopGroup boss = new NioEventLoopGroup();
        EventLoopGroup worker = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();

            bootstrap.group(boss, worker);
            bootstrap.channel(NioServerSocketChannel.class);
            bootstrap.option(ChannelOption.SO_BACKLOG, 1024); // 連接數(shù)
            bootstrap.option(ChannelOption.TCP_NODELAY, true); // 不延遲,消息立即發(fā)送
            bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); // 長連接
            bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel socketChannel)
                        throws Exception {
                    ChannelPipeline p = socketChannel.pipeline();
                    p.addLast(new NettyServerHandler());// 添加NettyServerHandler,用來處理Server端接收和處理消息的邏輯
                }
            });
            ChannelFuture channelFuture = bootstrap.bind(port).sync();
            if (channelFuture.isSuccess()) {
                System.err.println("啟動Netty服務(wù)成功似舵,端口號:" + this.port);
            }
            // 關(guān)閉連接
            channelFuture.channel().closeFuture().sync();

        } catch (Exception e) {
            System.err.println("啟動Netty服務(wù)異常审丘,異常信息:" + e.getMessage());
            e.printStackTrace();
        } finally {
            boss.shutdownGracefully();
            worker.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new NettyServer(10086);
    }
}

3. 創(chuàng)建NettyServerHandler,用來接收和回復(fù)Client端的消息

新建NettyServerHandler類推正,用來實(shí)現(xiàn)Server端接收和處理消息的邏輯

package com.jiutianbian.NettyTest;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

import java.io.UnsupportedEncodingException;

public class NettyServerHandler extends ChannelHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        
        ByteBuf buf = (ByteBuf) msg;
        
        String recieved = getMessage(buf);
        System.err.println("服務(wù)器接收到客戶端消息:" + recieved);
        
        try {
            ctx.writeAndFlush(getSendByteBuf("你好,客戶端"));
            System.err.println("服務(wù)器回復(fù)消息:你好宝惰,客戶端");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    /*
     * 從ByteBuf中獲取信息 使用UTF-8編碼返回
     */
    private String getMessage(ByteBuf buf) {

        byte[] con = new byte[buf.readableBytes()];
        buf.readBytes(con);
        try {
            return new String(con, "UTF8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    private ByteBuf getSendByteBuf(String message)
            throws UnsupportedEncodingException {

        byte[] req = message.getBytes("UTF-8");
        ByteBuf pingMessage = Unpooled.buffer();
        pingMessage.writeBytes(req);

        return pingMessage;
    }
}

4. 啟動Server端

Server啟動后的日志輸出植榕,如下圖所示


一、Netty Client端

1. 新建工程尼夺,通過meaven導(dǎo)入Netty的庫包

導(dǎo)入代碼同上面的Server端代碼

2. 創(chuàng)建NettyClient

新建NettyClient類

package com.jiutianbian.NettyClinetTest;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class NettyClient {

    /*
     * 服務(wù)器端口號
     */
    private int port;

    /*
     * 服務(wù)器IP
     */
    private String host;

    public NettyClient(int port, String host) throws InterruptedException {
        this.port = port;
        this.host = host;
        start();
    }

    private void start() throws InterruptedException {

        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();

        try {

            Bootstrap bootstrap = new Bootstrap();
            bootstrap.channel(NioSocketChannel.class);
            bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
            bootstrap.group(eventLoopGroup);
            bootstrap.remoteAddress(host, port);
            bootstrap.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel socketChannel)
                        throws Exception {
                    socketChannel.pipeline().addLast(new NettyClientHandler());
                }
            });
            ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
            if (channelFuture.isSuccess()) {
                System.err.println("連接服務(wù)器成功");
            }
            channelFuture.channel().closeFuture().sync();
        } finally {
            eventLoopGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new NettyClient(10086, "localhost");
    }
}

3. 創(chuàng)建NettyClientHandler尊残,用來向Server端的發(fā)送消息并處理回復(fù)信息

新建NettyClientHandler類,用來實(shí)現(xiàn)Server端接收和處理消息的邏輯

package com.jiutianbian.NettyClinetTest;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

import java.io.UnsupportedEncodingException;

public class NettyClientHandler extends ChannelHandlerAdapter {
    private ByteBuf firstMessage;

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        byte[] data = "你好淤堵,服務(wù)器".getBytes();
        firstMessage = Unpooled.buffer();
        firstMessage.writeBytes(data);
        ctx.writeAndFlush(firstMessage);
        System.err.println("客戶端發(fā)送消息:你好寝衫,服務(wù)器");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {
        ByteBuf buf = (ByteBuf) msg;
        String rev = getMessage(buf);
        System.err.println("客戶端收到服務(wù)器消息:" + rev);
    }

    private String getMessage(ByteBuf buf) {
        byte[] con = new byte[buf.readableBytes()];
        buf.readBytes(con);
        try {
            return new String(con, "UTF8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}

4. 啟動Client端

Client啟動后的Client端的日志輸出,如下圖所示



Server端日志輸出粘勒,此時(shí)如下


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竞端,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庙睡,更是在濱河造成了極大的恐慌事富,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乘陪,死亡現(xiàn)場離奇詭異统台,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啡邑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門贱勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事贵扰〕鹚耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵戚绕,是天一觀的道長纹坐。 經(jīng)常有香客問我,道長舞丛,這世上最難降的妖魔是什么耘子? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮球切,結(jié)果婚禮上谷誓,老公的妹妹穿的比我還像新娘。我一直安慰自己吨凑,他們只是感情好捍歪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怀骤,像睡著了一般费封。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒋伦,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音焚鹊,去河邊找鬼痕届。 笑死,一個胖子當(dāng)著我的面吹牛末患,可吹牛的內(nèi)容都是我干的研叫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼璧针,長吁一口氣:“原來是場噩夢啊……” “哼嚷炉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起探橱,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤申屹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隧膏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哗讥,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年胞枕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杆煞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖决乎,靈堂內(nèi)的尸體忽然破棺而出队询,到底是詐尸還是另有隱情,我是刑警寧澤构诚,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布蚌斩,位于F島的核電站,受9級特大地震影響唤反,放射性物質(zhì)發(fā)生泄漏凳寺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一彤侍、第九天 我趴在偏房一處隱蔽的房頂上張望肠缨。 院中可真熱鬧,春花似錦盏阶、人聲如沸晒奕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脑慧。三九已至,卻和暖如春砰盐,著一層夾襖步出監(jiān)牢的瞬間闷袒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工岩梳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囊骤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓冀值,卻偏偏與公主長得像也物,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子列疗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理滑蚯,服務(wù)發(fā)現(xiàn),斷路器抵栈,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 目前在java socket服務(wù)器開發(fā) 基本上都是基于MINA 和 Netty. 所以這2個東西是非常的重要. M...
    包_包閱讀 1,804評論 0 1
  • 1. Zero Copy傳輸 一般情況下告材,將服務(wù)器上的文件傳輸?shù)娇蛻舳藭r(shí),文件在服務(wù)端會經(jīng)歷如下copy過程:調(diào)用...
    aaron1993閱讀 2,953評論 0 0
  • 一間簡陋的屋里竭讳,一個孩子的母親躺在簡陋的床上创葡,身上蓋著一條單薄的被子,久經(jīng)不洗绢慢,看上去已經(jīng)骯臟了灿渴。 孩子在隔壁的廚...
    西門可情閱讀 314評論 0 1