Netty-1-一個簡單的服務器實例

文章所有涉及到“結論”的東西都是我自己從源碼,註釋,控制檯打印結果出中推測出來的,請勿相信百分之百正確

POM文件,我的博客介紹所有關於netty的文章都基於netty4,netty3與4的寫法有很多不同,netty5目測已經作廢,我將逐步完善關於netty的學習筆記,打造沒有任何多餘代碼的demo

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.43.Final</version>
</dependency>

下面寫一個小的netty服務器,在windows環境下,首先,建1個類,是我們自己處理事件的事件類

1.事件類

public class MyServerHandler1 implements ChannelInboundHandler {
	private String objName = UUID.randomUUID().toString();

	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":handlerAdded");
	}

	@Override
	public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":channelRegistered");
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":channelActive[所在通道:" + ctx.channel().id() + "]");
	}

	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":handlerRemoved");
	}

	@Override
	public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":channelUnregistered");
	}

	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":channelInactive");
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		System.out.println(objName + ":channelRead");
	}

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":channelReadComplete");
	}

	@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
		System.out.println(objName + ":userEventTriggered");
	}

	@Override
	public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
		System.out.println(objName + ":channelWritabilityChanged");
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		System.out.println(objName + ":exceptionCaught");
	}

}

下面是main函數,綁定9999端口

public static void main(String[] args) throws InterruptedException {
		EventLoopGroup boosGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		ServerBootstrap b = new ServerBootstrap();
		b.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new MyServerHandler1());
		ChannelFuture f = b.bind(9999).sync();
		f.channel().closeFuture().sync();
	}

好了,一個簡單的netty服務器搭建完成,接下來我準備往9999端口發送請求,你可以使用telnet命令,也可以用瀏覽器localhost:9999,反正無論什麼協議,什麼請求,都無所謂,因爲最終都是byte數組而已,接下來,cmd調出windows窗口
輸入

telnet localhost 9999

如圖
在這裏插入圖片描述
則控制檯打印出

f692156c-8985-45f1-be99-f6596fd565e2:handlerAdded
f692156c-8985-45f1-be99-f6596fd565e2:channelRegistered
f692156c-8985-45f1-be99-f6596fd565e2:channelActive[所在通道:b86364f5]

然後我再cmd一個新的窗口,依然輸入

telnet localhost 9999

此時控制檯打印出

f692156c-8985-45f1-be99-f6596fd565e2:handlerAdded
f692156c-8985-45f1-be99-f6596fd565e2:channelRegistered
f692156c-8985-45f1-be99-f6596fd565e2:channelActive[所在通道:da872349]

觀察兩次打印不同,得出結論
在本次示例代碼中,打開兩個客戶端去連接服務端,使用了兩個通道,但是這兩個通道使用的handler是同一個handler,也就是說只new 了一次MyServerHandler1

繼續操作,在黑窗口中按鍵盤上的任意按鍵,則控制檯會輸出

//從通道中讀數據
f692156c-8985-45f1-be99-f6596fd565e2:channelRead
//數據讀取完畢
f692156c-8985-45f1-be99-f6596fd565e2:channelReadComplete

繼續操作,點擊黑窗口右上角X,關閉窗口

//我也不知道爲什麼關閉窗口會觸發一次讀事件
f692156c-8985-45f1-be99-f6596fd565e2:channelReadComplete
f692156c-8985-45f1-be99-f6596fd565e2:channelInactive
f692156c-8985-45f1-be99-f6596fd565e2:channelUnregistered
f692156c-8985-45f1-be99-f6596fd565e2:handlerRemoved

結論:
一個客戶端連接服務端,發送一條消息,再關閉客戶端,服務端觸發的事件如下
1.handlerAdded:將ChannelHandler添加到ChannelPipeline之後觸發
2.channelRegistered:將Channel註冊到EventLoop後觸發
3.channelActive:將Channel激活後觸發
4.channelRead:從NioServerSocketChannel中讀數據後觸發
5.channelReadComplete:目前並不清楚與channelRead的區別
6.channelReadComplete:當關閉客戶端時,優先觸發
7.channelInactive:將Channel設置成未激活後觸發
8.channelUnregistered:將Channel從EventLoop移除後觸發
9.handlerRemoved:將ChannelHandler從ChannelPipeline移除之後觸發
九個步驟,八個(56相同)事件

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