jFinal集成netty问题

netty的客户端怎么在jFinal中启动 是手动运行main函数还是放在afterJFianlStart启动,我放在afterJFinalStart中启动没有反应

客户端启动代码
public class NettySSLClient extends Thread{
	
	private String host;
	private int port;
	private boolean auth;
	
	public NettySSLClient(String host, int port, boolean auth) {
		super();
		this.host = host;
		this.port = port;
		this.auth = auth;
	}

	@Override
	public void run() {
		try {
			start(host,port,auth);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void start(String host,int port,boolean auth) throws Exception{
		EventLoopGroup group = new NioEventLoopGroup();
		try{
			Bootstrap b = new Bootstrap();
		    b.group(group).channel(NioSocketChannel.class)
			    .handler(new ChannelInitializer<SocketChannel>(){
					@Override
					protected void initChannel(SocketChannel ch) throws Exception {
						ChannelPipeline pipeline = ch.pipeline();
						String cChatPath =  System.getProperty("user.dir")+"/src/main/resources/netty/conf/cChat.jks";
						SSLEngine engine = NettySSLContextFactory.getClientContext(cChatPath,cChatPath,auth).createSSLEngine();
						engine.setUseClientMode(true);//客户方模式
						pipeline.addLast("ssl", new SslHandler(engine));
						pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
						pipeline.addLast("decoder", new StringDecoder());
						pipeline.addLast("encoder", new StringEncoder());
						pipeline.addLast("handler", new NettySSLClientHandler());
					}
				});
		    Channel ch = b.connect(host, port).sync().channel();
		    ChannelFuture lastWriteFuture = null;
		    BufferedReader in = new BufferedReader(new InputStreamReader(
			    System.in));
		    for (;;) {
				String line = in.readLine();
				if (line == null) {
				    break;
				}
				lastWriteFuture = ch.writeAndFlush(line + "\r\n");
				if ("bye".equals(line.toLowerCase())) {
				    ch.closeFuture().sync();
				    break;
				}
		    }
		    if (lastWriteFuture != null) {
		    	lastWriteFuture.sync();
		    }
		}finally{
			group.shutdownGracefully();
		}
	}

	public static void main(String[] args) throws Exception {
		//new NettySSLClient().start("localhost", 9000,true);
	}

}
jFinal启动代码

@Override
	public void afterJFinalStart() {
		NettySSLClient nettyClient = new NettySSLClient("localhost", 9000, true);
		nettyClient.setDaemon(true);
		nettyClient.start();
	}


评论区

邓小杰

2019-07-16 18:03

要输就输给追求

2019-07-17 09:20

打断点跟一些下

邓小杰

2019-07-17 09:26

JFinal

2019-07-17 10:10

放在 afterJFianlStart() 或者 onStart() 中启动,新版本支持了 onStart() 方法回调

注意检查 netty 启动时是不是线程被阻塞了,造成 jfinal 启动过程止步于 onStart() 或 afterJFianlStart()

邓小杰

2019-07-17 13:55

@JFinal 波哥 客户端启动放入afterJFianlStart()中 启动不了 是new一个新线程 手动在main函数中启动是没问题的

JFinal

2019-07-17 15:32

@邓小杰 为啥不在 afterJFianlStart() 或 onStart() 中也同样用 new 一个新线程启动???

JFinal

2019-07-17 15:33

@邓小杰 我前面强调过 "阻塞", 就是要提醒你用 new Thread 的方式

邓小杰

2019-07-17 16:28

@JFinal 波哥,为什么服务端和客户端要新启动一个线程 为什么不能用plugin的形式启动???

JFinal

2019-07-17 16:30

@邓小杰 这个是 java 基础, 代码如果被阻塞,程序执行到那就不会动了, 你 new 出一个线程是让这个线程继续往下走,你的主线程才得以继续

这个问题与 jfinal 是完全无关的, 纯粹 java 基础

邓小杰

2019-07-17 16:51

@JFinal 波哥,afterJfinalstart回调两次怎么解决

JFinal

2019-07-17 16:55

@邓小杰 这事肯定与 jfinal 无关了,检查一下 tomcat 部署时的坑:
https://my.oschina.net/jfinal/blog/353062

邓小杰

2019-07-17 17:05

@JFinal 我用的是undertow启动的

@Override
public void afterJFinalStart() {
new Thread(new NettySSLServer(9000,PROP.getBoolean("netty.auth"))).start();
new Thread(new NettySSLClient("localhost", 9000, PROP.getBoolean("netty.auth"))).start();
new Thread(new NettySSLClient("localhost", 9000, PROP.getBoolean("netty.auth"))).start();
}
客户端启动的两个线程 被回调了两次

JFinal

2019-07-17 17:13

@邓小杰 jfinal undertow 是不可能回调 afterJFinalStart() 两次的,单步调试一下找原因

邓小杰

2019-07-17 17:15

@JFinal 谢谢波哥

沙漠浪人

2019-07-19 10:59

@JFinal @邓小杰 波哥,我试了下他的这个代码,他是把启动放到路由启动,用的afterJFinalStart方法自动启动客户端,确实出现控制台输出两遍客户端消息,我试着用线程去解决,还有单步调试,结果都一样,是因为netty原因吗,求波哥指教一下怎么解决

JFinal

2019-07-19 11:22

@沙漠浪人 netty 在本质上与 jfinal 是完全无关的, 所以,尽管先去学会用 netty 的使用就好

千万不要将 netty 与 jfinal 混在一起思考,否则出了问题容易把事情搞混淆,简单事情复杂化

终极建议是: 分别学会使用 netty 与 jfinal ,将这两个东东看成是完全不同的东东,然后各自用好就行

沙漠浪人

2019-07-19 13:24

@JFinal 好的,感谢

JFinal

2019-07-19 14:37

@沙漠浪人 落地到具体的办法是:
1:写一个 main 方法, 在 main 方法彻底会玩 netty , 注意 main 方法大致是这样:
public void static main(...) {
这里是使用 netty 的用法

// 关键在这里:
System.out.println("这里有输出,表示主线程没有被阻塞在 netty 的用法的代码之处");
}

以上 main 方法一中的输出一定要在控制台能看到,证明 netty 玩对了

2: 在第一步玩对的前提之下,将 main 方法中的代码全部 copy 到 jfinal 的 onStart() 中去即可

本质上就是要消除 netty 与 jfinal 在理解上的关联

人猿

2020-07-07 09:04

https://www.oschina.net/question/2988111_2246123

热门反馈

扫码入社