更多關于Java方面的文章,歡迎訪問燕歸來https://www.zhoutao123.com
官方那個給出的介紹是:Netty是由JBOSS提供的一個java開源框架掖疮。Netty提供異步的、事件驅(qū)動的網(wǎng)絡應用程序框架和工具颗祝,用以快速開發(fā)高性能浊闪、高可靠性的網(wǎng)絡服務器和客戶端程序恼布。然后我們簡單理解一下,這玩意就是個程序搁宾,干什么的折汞?netty是封裝java socket noi的。 類似的功能是 apache的mina盖腿。
使用Netty實現(xiàn)Socket丟棄服務
相對于Tomcat這種Web Server(顧名思義主要是提供Web協(xié)議相關的服務的)爽待,Netty是一個Network Server,是處于Web Server更下層的網(wǎng)絡框架翩腐,也就是說你可以使用Netty模仿Tomcat做一個提供HTTP服務的Web容器堕伪。其實一個好使的處理Socket的東西
實現(xiàn)丟棄服務
這里插一下,就是我們的的通信是建立在一定的協(xié)議之上的栗菜,就比如我們常用的Web工程欠雌,前臺(瀏覽器)發(fā)送一個請求,后臺做出相應返回相應的結果疙筹,這個SOCKET通信的過程亦是如此富俄。
在netty官方指南里面有講,世上最簡單的協(xié)議不是'Hello, World!' 而是 DISCARD(拋棄服務)而咆。這個協(xié)議將會拋棄任何收到的數(shù)據(jù)霍比,而不響應。就是你客戶端發(fā)送消息暴备,好悠瞬,發(fā)送過去了,服務器也收到了涯捻,但是拋棄了浅妆。
說白了,就是你發(fā)一條消息給我障癌,我收到了凌外,僅此而已,不做任何響應涛浙。下面我們看看大致的步驟康辑。
- 創(chuàng)建項目,添加Netty 依賴
- 實現(xiàn)丟棄服務
- 運行服務
- 使用Python進行測試
創(chuàng)建項目,添加Netty 依賴
使用IDEA創(chuàng)建一個普通項目,然后添加jar包或者直接創(chuàng)建一個maven項目也行轿亮。
在Maven中搜索netty-all 即可 地址是 http://mvnrepository.com/artifact/io.netty/netty-all 建議選擇5.0.0以上的版本疮薇。
或者直接創(chuàng)建Maven項目,引入依賴如下
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>5.0.0.Alpha2</version>
</dependency>
實現(xiàn)丟棄服務
package com.company;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;
/**
* 本文件由周濤創(chuàng)建,位于com.company包下
* 創(chuàng)建時間2018/4/20 11:46
* 郵箱:zhoutao@xiaodouwangluo.com
* 作用:實現(xiàn)丟棄服務
*
* @author tao
*/
public class DiscardServerHandle extends ChannelHandlerAdapter {
/**
* 接收到SOCKET的時候會調(diào)用此方法
* @param ctx
* @param msg
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
try {
//獲取到接收的內(nèi)容我注,并且實現(xiàn)
ByteBuf in = (ByteBuf) msg;
String message = in.toString(CharsetUtil.UTF_8);
System.out.println(message);
} finally {
ReferenceCountUtil.release(msg);
}
}
/**
* 有新的連接加入的時候
* @param ctx
* @throws Exception
*/
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
System.out.println("新增Channel ,ChannelId = " + ctx.channel().id());
}
/**
* 有連接斷開被移除的時候調(diào)用
* @param ctx
* @throws Exception
*/
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
System.out.println("移除Channel ,ChannelId = " + ctx.channel().id());
}
/**
* 發(fā)生異常的時候調(diào)用
* @param ctx
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
運行服務
package com.company;
import io.netty.bootstrap.ServerBootstrap;
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.NioServerSocketChannel;
/**
* 本文件由周濤創(chuàng)建,位于com.company包下
* 創(chuàng)建時間2018/4/20 11:46
* 郵箱:zhoutao@xiaodouwangluo.com
* 作用:創(chuàng)建運行服務
*
* @author tao
*/
public class DiscardServer {
private int port;
public DiscardServer(int port) {
this.port = port;
}
public void run() throws InterruptedException {
EventLoopGroup boos = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
System.out.println("準備運行在端口:" + String.valueOf(this.port));
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(boos, worker)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 128)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new DiscardServerHandle());
}
});
ChannelFuture sync = serverBootstrap.bind(port).sync();
sync.channel().closeFuture().sync();
} finally {
worker.shutdownGracefully();
boos.shutdownGracefully();
}
}
public static void main(String[] args) {
DiscardServer server = new DiscardServer(8080);
try {
server.run();
} catch (InterruptedException e) {
System.out.println("發(fā)生了異常信息,異常信息如下所示:");
e.printStackTrace();
}
}
}
使用Python進行測試
python內(nèi)置了socket庫可以實現(xiàn)連接按咒,我們這里使用Pyhton3.x來進行操作socket.當然這里只是演示SOCKET,你也可以使用其他方法嘗試連接socket比如 js,java,或者talnet命令仓手。
#!/usr/bin/env python
# encoding: utf-8
#coding=utf-8
__author__ = '藥師Aric'
'''
client端
長連接胖齐,短連接,心跳
'''
import socket
import time
host = '127.0.0.1'
port = 8080
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) #在客戶端開啟心跳維護
client.connect((host, port))
send_count = 0
try:
while True:
timeStr= time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
client.send((u"你好嗽冒,這是Python客戶端,已經(jīng)您發(fā)送消息 %s" % timeStr).encode())
send_count = send_count + 1
print("發(fā)送數(shù)據(jù)完成,已發(fā)送次數(shù):%d" % send_count)
time.sleep(2)
except:
print("當前系統(tǒng)已經(jīng)和服務器斷開連接....")
運行Pyhton 代碼呀伙,嘗試連接SOCKET,執(zhí)行一會之后停止pyhton 添坊,結果如下:
python發(fā)送的數(shù)據(jù)
/Users/tao/Code/Python/redisDemo/venv/bin/python /Users/tao/Code/Python/redisDemo/main/index.py
發(fā)送數(shù)據(jù)完成,已發(fā)送次數(shù):1
發(fā)送數(shù)據(jù)完成,已發(fā)送次數(shù):2
發(fā)送數(shù)據(jù)完成,已發(fā)送次數(shù):3
發(fā)送數(shù)據(jù)完成,已發(fā)送次數(shù):4
發(fā)送數(shù)據(jù)完成,已發(fā)送次數(shù):5
當前系統(tǒng)已經(jīng)和服務器斷開連接....
Netty收到的數(shù)據(jù)
更多關于Java方面的文章,歡迎訪問燕歸來https://www.zhoutao123.com