用NIO/BIO/Netty构建JavaFX可视化聊天室教程

需积分: 9 1 下载量 199 浏览量 更新于2024-10-27 收藏 25KB ZIP 举报
资源摘要信息:"NIO网络编程demo通过BIO,NIO,Netty三个方面写了javafx可视化聊天室,代码有注释" 知识点详细解析: 1. BIO(Blocking I/O)阻塞IO模型 在Java的早期版本中,传统的网络通信模型是基于BIO的,即阻塞IO模型。在BIO模型中,服务器会为每个客户端连接创建一个新的线程,用于处理客户端的请求。当有新的连接请求时,服务器会等待,直到一个线程空闲出来,然后处理该连接。这种模型的缺点是对于成千上万的并发连接,将会消耗大量的系统资源,导致资源利用率低下和服务器效率降低。BIO适用于连接数较小且固定的架构,随着客户端连接数量的增加,服务器端将需要创建更多的线程,从而导致性能瓶颈。 2. NIO(New I/O)非阻塞IO模型 NIO是Java提供的一种新的IO模型,它的核心是支持面向缓冲区的、基于通道的IO操作。NIO的主要特点是能够在等待时去做其他的事情,即非阻塞。与BIO相比,NIO通过使用选择器(Selector)来监控多个通道(Channel),从而实现单线程处理多个通道。当通道准备好读或写操作时,才会进行处理,这样就可以避免了BIO中的线程等待问题。NIO适用于高并发、连接数多的场景,比如高性能的网络服务器和中间件开发。 ***ty框架 Netty是一个高性能的网络应用程序框架,它简化了网络编程,比如TCP和UDP套接字服务器的开发。Netty采用事件驱动的方式,支持快速开发可维护的高性能协议服务器和客户端。Netty的架构设计允许快速开发可靠的网络应用,它能够自动管理缓冲区和线程池,使得开发者可以专注于业务逻辑的实现。Netty在内部使用了NIO模型,并且提供了一个丰富的API来处理网络事件,如连接、读写等。 4. JavaFX JavaFX是一个用于构建富客户端应用程序的库,它提供了丰富的图形和媒体包,可以用来创建图形用户界面。JavaFX支持桌面、网页和移动设备。通过JavaFX可以创建动画、图表、音频和视频等。在本次资源中,JavaFX被用来开发可视化聊天室的界面部分,使得聊天室的用户交互体验更为直观和丰富。 5. 可视化聊天室项目 本次资源中的项目是一个使用JavaFX创建的可视化聊天室客户端,结合了BIO、NIO和Netty三种不同的网络编程模型。项目包含多个文件,其中会有演示如何使用JavaFX提供的组件来构建用户界面,以及如何使用BIO、NIO和Netty来处理网络通信。项目中的代码应该包含注释,便于理解和学习,使得开发者能够逐步学习和掌握网络编程的相关知识和技术。 在整体的设计上,该资源可能采用了以下步骤: - 使用JavaFX创建聊天室的界面,包括消息显示区域、输入框和发送按钮等。 - 使用BIO模型实现一个简单的聊天服务器和客户端,通过创建多个线程来模拟处理多个客户端连接的情况,供开发者了解传统的网络编程方式。 - 使用NIO模型实现一个更高效的聊天服务器和客户端,以单线程或少量线程处理大量并发连接。 - 使用Netty框架实现一个高性能的聊天服务器和客户端,通过Netty的事件循环和编解码器机制,展示Netty在处理大量网络连接上的优势。 - 整个项目通过代码注释详细说明了实现聊天室的各个步骤,包括客户端和服务器端的交互逻辑、事件处理流程以及数据传输等。 总结而言,该资源是一个针对网络编程和JavaFX界面开发的综合示例项目,旨在帮助开发者通过实践学习掌握多种网络编程技术以及JavaFX界面开发的方法。通过对该资源的学习,开发者可以更好地理解BIO和NIO的区别,Netty框架的工作原理,以及如何使用JavaFX创建用户友好的界面。

2023-07-13 09:15:56,872 WARN org.apache.flink.runtime.dispatcher.DispatcherRestEndpoint [] - Unhandled exception java.io.IOException: Connection reset by peer at sun.nio.ch.FileDispatcherImpl.read0(Native Method) ~[?:1.8.0_372] at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) ~[?:1.8.0_372] at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_372] at sun.nio.ch.IOUtil.read(IOUtil.java:192) ~[?:1.8.0_372] at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379) ~[?:1.8.0_372] at org.apache.flink.shaded.netty4.io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) ~[flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) ~[flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [flink-dist-1.15.3.jar:1.15.3] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_372]

2023-07-14 上传

com.fmall58.wechatsub.business.bizs.UException at com.fmall58.wechatsub.business.service.PubService.isBindWeChatSub(PubService.java:76) at com.fmall58.wechatsub.business.bizs.PubHelper.isBindWeChatSub(PubHelper.java:125) at com.fmall58.wechatsub.business.bizs.PubHelper.execute(PubHelper.java:38) at com.fmall58.wechatsub.server.handlers.ServerHandler.channelRead(ServerHandler.java:103) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:656) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:591) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:508) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:470) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:909) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)

2023-06-11 上传
2023-06-12 上传

Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: 拒绝连接: node01/192.168.72.110:7077 Caused by: java.net.ConnectException: 拒绝连接 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:715) at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) 23/07/07 22:44:06 ERROR StandaloneSchedulerBackend: Application has been killed. Reason: All masters are unresponsive! Giving up. 23/07/07 22:44:06 WARN StandaloneSchedulerBackend: Application ID is not initialized yet. 23/07/07 22:44:06 INFO Utils: Successfully started service 'org.apache.spark.network.netty.NettyBlockTransferService' on port 45096. 23/07/07 22:44:06 INFO NettyBlockTransferService: Server created on node01:45096 23/07/07 22:44:06 INFO BlockManager: Using org.apache.spark.storage.RandomBlockReplicationPolicy for block replication policy 23/07/07 22:44:06 INFO SparkUI: Stopped Spark web UI at http://node01:4040 23/07/07 22:44:06 INFO BlockManagerMaster: Registering BlockManager BlockManagerId(driver, node01, 45096, None) 23/07/07 22:44:06 INFO StandaloneSchedulerBackend: Shutting down all executors

2023-07-11 上传