2022-06-24Netty

Netty通過UDP廣播

Netty 是一個利用 Java 的高級網絡的能力睛约,隱藏了Java背后的復雜性然后提供了一個易于使用的 API 的客戶端/服務器框架。支撐nio編程迹栓,可以提升并發(fā)性能;netty的特性是零拷貝,直接在內存中開辟一塊藕夫,省去了socket緩沖區(qū);封裝完美使得編碼簡便

Netty的bootstrap

參考博客

引導類的層次結構包括一個抽象的父類和兩個具體的引導子類:

方法 描述
group 設置用于處理所有事件的 EventLoopGroup
channel 指定服務端或客戶端的 Channel
channelFactory 如果引導沒有指定Channel,那么可以指定ChannelFactory來創(chuàng)建Channel
localAddress 指定Channel需要綁定的本地地址毅贮,如果不指定梭姓,則將由系統(tǒng)隨機分配一個地址
remoteAddress 設置Channel需要連接的遠程地址
attr 指定新創(chuàng)建的Channel的屬性值
handler 設置添加到ChannelPipeline中的ChannelHandler
connect 連接到遠程主機,返回ChannelFuture嫩码,用于連接完成的回調
bind 綁定指定地址誉尖,返回ChannelFuture,用于綁定完成的回調

引導客戶端和無連接協(xié)議Booststrap

當需要引導客戶端或一些無連接協(xié)議時铸题,需要使用 Bootstrap 類铡恕。Bootstrap 類負責創(chuàng)建管道給客戶或應用程序,作為客戶端丢间,我們需要使用到 connect API 來連接到遠程 服務端探熔,其過程如下:

引導服務端ServerBootstrap

ServerBootstrap 負責Netty應用程序的服務端引導,作為服務端烘挫,我們需要使用 bind API來 與本地地址綁定诀艰,從而接收客戶端連接,其過程如下:

image.png

導入maven依賴

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.10.5.Final</version>
        </dependency>

Server

@Data
@Slf4j
@Component
@ConfigurationProperties(prefix = "netty")
@ConditionalOnProperty(prefix = "netty.udp.server", name = "enable", havingValue = "true", matchIfMissing = false)
public class NettyUdpServer {

    private Bootstrap bootstrap = new Bootstrap();

    private NioEventLoopGroup group = new NioEventLoopGroup();

    private Channel channel;

    private Integer clientPort;

    private Integer serverPort;

    @PostConstruct
    public void start() throws InterruptedException {
        bootstrap.group(group)
                .channel(NioDatagramChannel.class)
                .option(ChannelOption.SO_BROADCAST, true)
                .option(ChannelOption.SO_RCVBUF, 1024 * 1024 * 100)
                .option(ChannelOption.SO_SNDBUF, 1024 * 1024 * 100)
                .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535))
                .handler(new ChannelInitializer<Channel>() {
                    @Override
                    protected void initChannel(Channel channel) throws Exception {
                        ChannelPipeline pipeline = channel.pipeline();
                        pipeline.addLast(new NettyUdpServerHandler());
                    }
                });
        channel = bootstrap.bind(serverPort).sync().channel();
        log.info("----------------------------UdpServer start success");
    }

    @PreDestroy
    public void destory() throws InterruptedException {
        group.shutdownGracefully().sync();
        log.info("----------------------------關閉NettyServer");
    }

    public void sendToAll(String msg) {
        try {
            this.channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(
                    msg, CharsetUtil.UTF_8), new InetSocketAddress("255.255.255.255", clientPort)));
        } catch (Exception e) {
            return;
        }
    }
}

Client

@Data
@Component
@Configuration
@Slf4j
@ConfigurationProperties(prefix = "netty")
@ConditionalOnProperty(prefix = "netty.udp.client", name = "enable", havingValue = "true", matchIfMissing = false)
public class NettyUdpClient {

    private Bootstrap bootstrap = new Bootstrap();

    private NioEventLoopGroup group = new NioEventLoopGroup();

    private Channel channel;

    private Integer clientPort;

    private Integer serverPort;

    private String serverIp;

    @PostConstruct
    public void start() throws InterruptedException {
        bootstrap.group(group)
                .channel(NioDatagramChannel.class)
                .option(ChannelOption.SO_BROADCAST, true)
                .option(ChannelOption.SO_RCVBUF, 1024 * 1024 * 100)
                .option(ChannelOption.SO_SNDBUF, 1024 * 1024 * 100)
                .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535))
                .handler(new ChannelInitializer<Channel>() {
                    @Override
                    protected void initChannel(Channel channel) throws Exception {
                        ChannelPipeline pipeline = channel.pipeline();
                        pipeline.addLast(new NettyUdpClientHandler());
                    }
                });
        channel = bootstrap.bind(clientPort).sync().channel();
        log.info("----------------------------UdpClient start success");
    }

    @PreDestroy
    public void destory() throws InterruptedException {
        group.shutdownGracefully().sync();
        log.info("----------------------------關閉Netty");
    }

    public void sendToServer(String msg) {
        try {
            MessageProtocol protocol = new MessageProtocol(msg.getBytes(CharsetUtil.UTF_8).length,msg.getBytes(CharsetUtil.UTF_8));
            this.channel.writeAndFlush(new DatagramPacket(protocol.toByteBuf(), new InetSocketAddress(serverIp, serverPort)));
        } catch (Exception e) {
            return;
        }
    }


}

Handler

@Slf4j
public class NettyUdpClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception {
        System.out.printf("-------udp客戶端收到數據:" + datagramPacket.content().toString(CharsetUtil.UTF_8));

    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末饮六,一起剝皮案震驚了整個濱河市其垄,隨后出現的幾起案子,更是在濱河造成了極大的恐慌卤橄,老刑警劉巖绿满,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異窟扑,居然都是意外死亡喇颁,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門嚎货,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橘霎,“玉大人,你說我怎么就攤上這事殖属〗闳” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵忱辅,是天一觀的道長七蜘。 經常有香客問我,道長墙懂,這世上最難降的妖魔是什么橡卤? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮损搬,結果婚禮上碧库,老公的妹妹穿的比我還像新娘柜与。我一直安慰自己,他們只是感情好嵌灰,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布弄匕。 她就那樣靜靜地躺著,像睡著了一般沽瞭。 火紅的嫁衣襯著肌膚如雪迁匠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天驹溃,我揣著相機與錄音城丧,去河邊找鬼。 笑死豌鹤,一個胖子當著我的面吹牛亡哄,可吹牛的內容都是我干的。 我是一名探鬼主播布疙,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蚊惯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灵临?” 一聲冷哼從身側響起截型,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俱诸,沒想到半個月后菠劝,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睁搭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了笼平。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片园骆。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寓调,靈堂內的尸體忽然破棺而出锌唾,到底是詐尸還是另有隱情,我是刑警寧澤夺英,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布晌涕,位于F島的核電站,受9級特大地震影響痛悯,放射性物質發(fā)生泄漏余黎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一载萌、第九天 我趴在偏房一處隱蔽的房頂上張望惧财。 院中可真熱鬧巡扇,春花似錦、人聲如沸垮衷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搀突。三九已至刀闷,卻和暖如春部默,著一層夾襖步出監(jiān)牢的瞬間复凳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工馆里, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轩勘,地道東北人筒扒。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像绊寻,于是被迫代替她去往敵國和親花墩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容