socket网络编程-中级篇
Posted fzj读你
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket网络编程-中级篇相关的知识,希望对你有一定的参考价值。
1.了解netty的初步
2. Example
3. Netty核心技术(TCP拆包和粘包问题)
4. Netty核心技术(编解码技术)
5. Netty的UDP实现
6. Netty的websocket实现
*********************************************************************************************************************
1.1 netty为什么选择netty
问题:
现如今我们使用通用的应用程序或者类库来实现系统之间地互相访问,比如我们经常使用一个HTTP客户端来从web服务器上获取信息,或者通过web service来执行一个远程的调用。
然而,有时候一个通用的协议和他的实现并没有覆盖一些场景。比如我们无法使用一个通用的HTTP服务器来处理大文件、电子邮件、近实时消息比如财务信息和多人游戏数据。我们需要一个合适的协议来处理一些特殊的场景。例如你可以实现一个优化的Ajax的聊天应用、媒体流传输或者是大文件传输的HTTP服务器,你甚至可以自己设计和实现一个新的协议来准确地实现你的需求。
另外不可避免的事情是你不得不处理这些私有协议来确保和原有系统的互通。
简单
1.2 netty简介
netty是基于Java NIO的网络应用框架
netty是一个NIO client-server(客户端服务器)服务器框架,使用netty可以快速开发网络应用。例如服务器和客户端协议。netty提供了一种新的方式来开发网络应用。这种方式使得它很容易和很强的扩展性。netty内部实现很复杂。但是它提供了简单易用的API对业务进行解耦。Netty是完全基于NIO实现的,所以整个netty都是异步的。网络应用程序通常需要有较高的扩展性,无论是netty还是其他基于java NIO的框架,都会提供可扩展性的解决方案。netty中一个关键组成部分是它的异步特性。
架构组成:
特性:
1.2 hello world
Netty 实现通信的步骤:
1 创建两个NIO线程组,一个专门用于网络事件处理(接受客户端连接),另一个则进行网络通信读写
2 创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传出数据的缓存大小等等。
3 创建一个实际处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式、已经实际处理数据的接口。
4 绑定端口,执行同步阻塞方法等待服务器端启动即可。
1.3 Netty核心技术(TCP拆包和粘包问题)
熟悉TCP编程的可能都知道,无论是服务器还是客户端,当我们读取或者发送数据的时候,都需要考虑TCP底层的粘包/拆包机制。
TCP是一个“流”的协议,所谓流就是没有界限的遗传数据。大家可以想象下如果河里的就好比数据,他们连成一片,没有分界线,TCP并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,也就是说,在业务上,我们一个完整的包会被TCP分成多个包进行发送、也可能把多个小包合并封装成一个大的数据包发送出去,这就是所谓的TCP拆包和粘包问题.
TCP拆包和粘包产生的原因:
1.应用程序wirte写入的字节大小大于套接口缓冲区的大小
2.进行MSS大小的TCP分段
3 以太网帧的payload大于MTU进行IP分片
如何解决:
case1: 消息定长,例如每个报文的大小固定为200个字符,如果不够,空位补空格。
对应类:FixedLengthFrameDecoder
修改客户端代码:
case2: 在包尾增加特殊字符进分割,例如加回车等。
对应类:DelimiterBaseFrameDecoder
以$_结尾
修改客户端代码:
case3: 将消息分为消息头和消息体,在消息头中包含表示消息总长度的字段,然后进行业务逻辑的处理。
网上查
1.4 netty编解码技术
编解码技术,说白了就是java的序列化技术,序列化的目的就两个:一是进行网络传输,而是对象持久化。
虽然我们可以使用java的对象序列化,netty去传输,但是java序列化的硬伤太多。比如java序列化无法跨语言、序列化后码流太大、序列化性能太低等。
主流序列化框架:
● JBoss的Marshailing包
● google的Protobuf
● 基于Protobuf的Kyro
● MessagePack框架
exmaple:JBoss Marshailing
JBoss Marshailing是一个java对象序列化包,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializeable接口的兼容,同时增加一些可谓的参数和附加特性。
与netty结合非常简单。
操作系统兼容的斜杠:File.separatorChar
1.5 udp
略,一个客户端发起,整个网段都能收到数据报。
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议.
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议.,提供面向事物的简单不可靠信息传送服务。
UDP协议全称是用户数据协议,在网络中它与TCP一样处理数据包,是一种无连接的协议。OSI模型中第四层-传输层。处于IP协议的上一层。UDP有不提供数据包分组,组装和 不能对数据进行包进行排序的缺点,也就是说,当报文发送之后,是无法得知是否安全完整到达的。
场景:
udp用来支持那些需要在计算机之间传输数据的网络应用,包括网络视频会议系统....
1.6 websocket
websocket将网络套接字引入到了客户端和服务端,众所周知,我们之前实现聊天功能,可能需要古老的Socket技术。或者用DWR(Direct Web Remoting))框架、反向ajax技术,再有可能用Comet服务器推送技术,今天我们的H5的websocket可以轻松的实现聊天功能,netty封装了其协议。
ws特点:
● 单一的TCP连接,双向可通信。
● 对代理器、防火墙和路由器透明
● 无头部信息、Cookie和认证
● 无安全开哨
● 通过ping/pongz帧保持链路激活
● 服务器可主动传递消息给客户端,不再需要客户端轮询
以上是关于socket网络编程-中级篇的主要内容,如果未能解决你的问题,请参考以下文章