随笔分类 - Netty 网络编程
学习 Netty,掌握Java网络编程基础
摘要:专业术语 中文 英文 TCP数据段 TCP Segment IP数据报 IP Datagram Ethernet数据帧 Ethernet Frame 1、TCP Segment 在 RFC793 传输控制协议,即最初的TCP网络规范中,TCP segment 和 TCP segments 关键字总计
阅读全文
摘要:我最近在项目中,遇到一个问题,ctx.close() 和 ctx.channel().close() 到底有何区别? 即调用 ChannelHandlerContext#close() 和 Channel#close() 有何不同? 从现象来看 建议先看一下下面这篇文章: [翻译]Netty4中 C
阅读全文
摘要:没写过死锁,怎么能算学过网络编程呢?我在思考如何分离 接收连接的Acceptor线程 和 处理网络I/O的Selector-IO线程时,终于写出了一个死锁的例子。本文附上了线程 dump 记录和死锁发生现场的分析,希望能够帮助大家对NIO网络编程中存在的死锁情况形成初步的印象。
阅读全文
摘要:Reactor 模式,主要分为单 Reactor 单线程模式,单 Reactor 多线程模式,多 Reactor 多线程模式。在 Netty 的官方 Demo 中,推荐使用多 Reactor 多线程模式。
阅读全文
摘要:继上一章 Netty之ByteBuf 之后,我们继续来谈 ByteBuf 的 API 清理操作 discardReadBytes 操作 因为 TCP 底层可能粘包,几百个整包消息被 TCP 粘包后作为一个整包发送。这样,通过 discardReadBytes 操作可以重用之前已经解码过的缓冲区,从而
阅读全文
摘要:ByteBuf 功能说明 上一篇文章 NIO入门之缓冲区Buffer 已经介绍了 Java 1.4 引入的 java.nio.Buffer。 从功能角度而言,ByteBuffer 完全可以满足 NIO 编程的需要,但是由于 NIO 编程的复杂性,ByteBuffer 也有其局限性,它的主要缺点如下:
阅读全文
摘要:本文使用 java.nio.channels 中的类实现了一个简陋的 Http 服务器。实现了网络 IO 逻辑与业务逻辑分离,分别运行在 IO 线程和 业务线程池中。
HTTP 是基于 TCP 协议之上的半双工通信协议,客户端向服务端发起请求,服务端处理完成后,给出响应。
HTTP 报文主要由三部分构成:起始行,首部,主体。
其中起始行是必须的,首部和主体都是非必须的。起始行和首部都采用文本格式且都是结构化的。主体部分既可以是二进制数据也可以是文本格式的数据。
阅读全文
摘要:java 1.4 引入 java.nio 包,使用这些 API 可以实现一个 BIO 模型,也可以实现 NIO 模型。
BIO模型在客户端与服务端建立连接之后,服务端就会立即分配一个线程,但是服务端又需要阻塞线程来等待读取客户端发送数据。
这样就需要不断创建新的线程应对不断增加的服务端请求,而创建线程是需要消耗服务器性能的。那么可不可以等客户端数据到达后再分配线程进行处理呢?
Selector 以及基于事件处理的 NIO 模型“应运而生”。
阅读全文
摘要:Socket#setSoTimeout 可以设置读超时时长。如果超过了给定时间,则抛出一个 InterruptedIOException 异常。
ServerSocket#setTimeout 可以设置 ServerSocket#accept 的等待连接的超时时间。如果超过了给定时间,则抛出一个 InterruptedIOException 异常。
Socket#connect 有一个 timeout 参数,可以设置连接超时时长。如果超过了给定时间,则抛出一个 InterruptedIOException 异常。
阅读全文
摘要:backlog 参数表示套接字上请求的最大挂起连接数,即将连接的队列长度。
减少 accept 之后的延迟,可以保证更多的套接字连接到我们的服务器。
阅读全文
摘要:本文介绍了如何使用 Socket 和 ServerSocket 分别实现 Java 客户端和 Java 服务端,同时还详细介绍了用到的 API。
另外还使用 Socket 和 ServerSocket 实现一条线程处理一个 Socket 连接的 BIO 模型。
阅读全文
摘要:TCP 是传输层协议,为应用程序提供了稳定可靠的数据传输。它是一个滑动窗口协议,提供了超时和重传的处理。
TCP 是在两个端点之间建立的全双工虚拟连接。每个端点由 IP 地址和端口号定义。
数据以字节流的形式传输,字节流按段传输。窗口大小决定了在需要接收方确认之前可以发送的数据字节数。
阅读全文
摘要:Selector、SelectableChannel、SelectionKey 是 Java NIO 多路复用中的核心组件。
多路复用技术主要用于网络编程,SelectableChannel 其主要实现包含 DatagramChannel、ServerSocketChannel 和 SocketChannel。
Selecter 是 SelectableChannel 在设置非阻塞情况下使用的多路复用选择器。
SelectableChannel 支持注册事件的信道。
SelectionKey 是注册事件后,建立 Selector 与 SelectableChannel 之间关系的桥梁。
阅读全文
摘要:Buffer缓存区是NIO的重要组件,本文将以图文混合的方式为大家展示主要的API方法
阅读全文