discard python_Netty入门教程(一) 实现DISCARD服务
官方那個給出的介紹是:Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。然后我們簡單理解一下,這玩意就是個程序,干什么的?netty是封裝java socket noi的。 類似的功能是 apache的mina。
使用Netty實現Socket丟棄服務
相對于Tomcat這種Web Server(顧名思義主要是提供Web協議相關的服務的),Netty是一個Network Server,是處于Web Server更下層的網絡框架,也就是說你可以使用Netty模仿Tomcat做一個提供HTTP服務的Web容器。其實一個好使的處理Socket的東西
實現丟棄服務
這里插一下,就是我們的的通信是建立在一定的協議之上的,就比如我們常用的Web工程,前臺(瀏覽器)發送一個請求,后臺做出相應返回相應的結果,這個SOCKET通信的過程亦是如此。
在netty官方指南里面有講,世上最簡單的協議不是'Hello, World!' 而是 DISCARD(拋棄服務)。這個協議將會拋棄任何收到的數據,而不響應。就是你客戶端發送消息,好,發送過去了,服務器也收到了,但是拋棄了。
說白了,就是你發一條消息給我,我收到了,僅此而已,不做任何響應。下面我們看看大致的步驟。
創建項目,添加Netty 依賴
實現丟棄服務
運行服務
使用Python進行測試
創建項目,添加Netty 依賴
使用IDEA創建一個普通項目,然后添加jar包或者直接創建一個maven項目也行。
在Maven中搜索netty-all 即可 地址是 http://mvnrepository.com/artifact/io.netty/netty-all 建議選擇5.0.0以上的版本。
或者直接創建Maven項目,引入依賴如下
io.netty
netty-all
5.0.0.Alpha2
實現丟棄服務
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;
/**
* 本文件由周濤創建,位于com.company包下
* 創建時間2018/4/20 11:46
* 郵箱:zhoutao@xiaodouwangluo.com
* 作用:實現丟棄服務
*
* @author tao
*/
public class DiscardServerHandle extends ChannelHandlerAdapter {
/**
* 接收到SOCKET的時候會調用此方法
* @param ctx
* @param msg
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
try {
//獲取到接收的內容,并且實現
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());
}
/**
* 有連接斷開被移除的時候調用
* @param ctx
* @throws Exception
*/
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
System.out.println("移除Channel ,ChannelId = " + ctx.channel().id());
}
/**
* 發生異常的時候調用
* @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;
/**
* 本文件由周濤創建,位于com.company包下
* 創建時間2018/4/20 11:46
* 郵箱:zhoutao@xiaodouwangluo.com
* 作用:創建運行服務
*
* @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() {
@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("發生了異常信息,異常信息如下所示:");
e.printStackTrace();
}
}
}
使用Python進行測試
python內置了socket庫可以實現連接,我們這里使用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客戶端,已經您發送消息 %s" % timeStr).encode())
send_count = send_count + 1
print("發送數據完成,已發送次數:%d" % send_count)
time.sleep(2)
except:
print("當前系統已經和服務器斷開連接....")
運行Pyhton 代碼,嘗試連接SOCKET,執行一會之后停止pyhton ,結果如下:
python發送的數據
/Users/tao/Code/Python/redisDemo/venv/bin/python /Users/tao/Code/Python/redisDemo/main/index.py
發送數據完成,已發送次數:1
發送數據完成,已發送次數:2
發送數據完成,已發送次數:3
發送數據完成,已發送次數:4
發送數據完成,已發送次數:5
當前系統已經和服務器斷開連接....
Netty收到的數據
image
總結
以上是生活随笔為你收集整理的discard python_Netty入门教程(一) 实现DISCARD服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊天室程序python_Python聊天
- 下一篇: python计算定积分_python编程