体育资讯网

您现在的位置是:首页 > 分类13 > 正文

分类13

netty5.0源码(netty中文社区)

hacker2022-06-10 22:19:28分类1348
本文目录一览:1、netty源码的依赖包怎么获取

本文目录一览:

netty源码的依赖包怎么获取

Maven项目的jar包不是应该在Maven的指定的目录吗? 为什么要做这么多无用的工作,直接用mvn install 把所有的jar包下载完成后,在Eclipse中直接导入一个Maven项目不就可以了

为啥netty 5.0 官网没有了

java compiler compliance level:

build path的JDK版本是你开发的时候编译器需要使用到的netty5.0源码,例如,如果用的JDK1.4就不能使用泛型。而java compiler compliance level设置的是你写好的JAVA代码按照什么JDK版本级别编译,例如:设置的是1.4,编译出来的class文件可以在1.4以上的JRE上运行,如果用的是5.0级别编译,就不能运行在1.4的环境里面,会提示版本过高。

只要build path的JDK版本高于或等于java compiler compliance level里面的级别都可以

所以,这个netty用netty5.0源码了jdk7的语法所以需要jdk7build,但是确是在jdk5级别编译的,所以可以在jre1.5以上运行

如何配置方便阅读和记录注释Netty源码文件的IDEA环境

一、找到文件和代码的模板设置 Preferences-Editor-File and Code Templates,然后在Templates这个tab下,选择你需要修改的文件类型的头模板。 二、修改注释 选中上一步的某一个类型以后,将#parse("File Header.java")这一行删除。

如何使用Netty实现心跳检测

新建Java工程,并导入netty使用的jar包,最好将源码包也放在本工程下,便于了解netty的源码实现。

可以从netty自带的example中复制一个例子过来,在此基础上进行修改。

在此基础上对代码进行改造。打开EchoServer.java,添加空闲检测类。

编写心跳检测处理类。并将此类添加到pinpline的handler里面。

改造完了服务端,需要对客户端内容改造一下。启动客户端后,先发一个“hello”消息,然后等候服务端心跳信息“ping”,收到心跳后,回复心跳响应“ok”。心跳消息可以根据需要进行定义。修改的类为EchoClientHandler。

为方便查看可以将netty的日志打开。

即:将此句p.addLast(new LoggingHandler(LogLevel.INFO));前面的注释去掉,执行测试一下。查看服务端,可以看到心跳包和心跳响应。

将客户端回复心跳的内容删除,再执行查看结果。此时可以看到服务端在30秒内没有收到心跳,认为客户端连接出现问题,将此连接关闭。

如何编译 netty 源码并导入android studio

 一、修改Android Studio(以下简称AS)的内存配置

因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio.vmoptions中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。

二、配置AS的JDK、SDK

在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件

并将其作为要使用的SDK的Java SDK。

三、生成导入AS所需配置文件(*.ipr)

①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)

②检查out/host/linux-x86/framework/目录下是否有idegen.jar

如果idegen.jar不存在,执行:

mmm development/tools/idegen/

在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。

我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。

③执行

development/tools/idegen/idegen.sh

等待出现类似下面的结果:

Read excludes: 5ms

Traversed tree: 44078ms

这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件

netty的实例是什么?

package netty.timeserver.server;

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;

public class TimeServer {

public void bind(int port) throws Exception {

EventLoopGroup bossGroup = new NioEventLoopGroup();

EventLoopGroup workerGroup = new NioEventLoopGroup();

try {

// 配置服务器的NIO线程租

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workerGroup)

.channel(NioServerSocketChannel.class)

.option(ChannelOption.SO_BACKLOG, 1024)

.childHandler(new ChildChannelHandler());

// 绑定端口,同步等待成功

ChannelFuture f = b.bind(port).sync();

// 等待服务端监听端口关闭

f.channel().closeFuture().sync();

} finally {

// 优雅退出,释放线程池资源

bossGroup.shutdownGracefully();

workerGroup.shutdownGracefully();

}

}

private class ChildChannelHandler extends ChannelInitializerSocketChannel {

@Override

protected void initChannel(SocketChannel arg0) throws Exception {

System.out.println("server initChannel..");

arg0.pipeline().addLast(new TimeServerHandler());

}

}

public static void main(String[] args) throws Exception {

int port = 9000;

if (args != null args.length 0) {

try {

port = Integer.valueOf(args[0]);

} catch (NumberFormatException e) {

}

}

new TimeServer().bind(port);

}

}

TimeServerHandler.java

package netty.timeserver.server;

import java.util.Date;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

public class TimeServerHandler extends ChannelInboundHandlerAdapter {

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg)

throws Exception {

System.out.println("server channelRead..");

ByteBuf buf = (ByteBuf) msg;

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req, "UTF-8");

System.out.println("The time server receive order:" + body);

String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(

System.currentTimeMillis()).toString() : "BAD ORDER";

ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());

ctx.write(resp);

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

System.out.println("server channelReadComplete..");

ctx.flush();//刷新后才将数据发出到SocketChannel

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)

throws Exception {

System.out.println("server exceptionCaught..");

ctx.close();

}

}

TimeClient.java

package netty.timeserver.client;

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 TimeClient {

public void connect(int port, String host) throws Exception {

// 配置客户端NIO线程组

EventLoopGroup group = new NioEventLoopGroup();

try {

Bootstrap b = new Bootstrap();

b.group(group).channel(NioSocketChannel.class)

.option(ChannelOption.TCP_NODELAY, true)

.handler(new ChannelInitializerSocketChannel() {

@Override

protected void initChannel(SocketChannel arg0)

throws Exception {

System.out.println("client initChannel..");

arg0.pipeline().addLast(new TimeClientHandler());

}

});

// 发起异步连接操作

ChannelFuture f = b.connect(host, port).sync();

// 等待客户端链路关闭

f.channel().closeFuture().sync();

} finally {

// 优雅退出,释放NIO线程组

group.shutdownGracefully();

}

}

public static void main(String[] args) throws Exception {

int port = 9000;

if (args != null args.length 0) {

try {

port = Integer.parseInt(args[0]);

} catch (Exception e) {

}

}

new TimeClient().connect(port, "127.0.0.1");

}

}

TimeClientHandler.java

package netty.timeserver.client;

import java.util.logging.Logger;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

public class TimeClientHandler extends ChannelInboundHandlerAdapter {

private static final Logger logger = Logger

.getLogger(TimeClientHandler.class.getName());

private final ByteBuf firstMessage;

public TimeClientHandler() {

byte[] req = "QUERY TIME ORDER".getBytes();

firstMessage = Unpooled.buffer(req.length);

firstMessage.writeBytes(req);

}

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception {

//与服务端建立连接后

System.out.println("client channelActive..");

ctx.writeAndFlush(firstMessage);

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg)

throws Exception {

System.out.println("client channelRead..");

//服务端返回消息后

ByteBuf buf = (ByteBuf) msg;

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req, "UTF-8");

System.out.println("Now is :" + body);

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)

throws Exception {

System.out.println("client exceptionCaught..");

// 释放资源

logger.warning("Unexpected exception from downstream:"

+ cause.getMessage());

ctx.close();

}

使用maven,在pom.xml中添加如下代码

dependency

groupIdio.netty/groupId

artifactIdnetty-all/artifactId

version5.0.0.Alpha2/version

/dependency

第二步: 编写Server端代码

NettyServerBootstrap代码

import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;

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;

import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

import io.netty.handler.timeout.IdleStateHandler;

d(port).sync();

if (f.isSuccess()) {

logger.debug("启动Netty服务成功,端口号:" + this.port);

}

// 关闭连接

f.channel().closeFuture().sync();

} catch (Exception e) {

logger.error("启动Netty服务异常,异常信息:" + e.getMessage());

e.printStackTrace();

} finally {

boss.shutdownGracefully();

worker.shutdownGracefully();

}

}

public static void main(String[] args) throws InterruptedException {

NettyServerBootstrap server= new NettyServerBootstrap(9999);

}

}

NettyServerHandler代码

import java.io.UnsupportedEncodingException;

import com.datong.base.module.netty.common.Constant;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

public class NettyServerHandler extends ChannelHandlerAdapter {

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) {

ByteBuf buf = (ByteBuf) msg;

String recieved = getMessage(buf);

System.out.println("服务器接收到消息:" + recieved);

try {

ctx.writeAndFlush(getSendByteBuf("APPLE"));

} 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, Constant.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;

}

}

发表评论

评论列表

  • 离鸢婼粥(2022-06-11 06:04:20)回复取消回复

    } }); // 发起异步连接操作 ChannelFuture f = b.conn

  • 青迟煞尾(2022-06-11 04:40:12)回复取消回复

    tdownGracefully(); } } public static void main(String[] args) throws Exception {