但是DatagramPacket中封装的是ByteBuf对象,如果我们想要向UDP channel中写入对象,那么需要一个将对象转换成为ByteBuf的方法,很明显netty提供的protobuf编码解码器就是一个这样的方法。
那么可不可以将NioDatagramChannel和ProtobufDecoder,ProtobufEncoder相结合呢?
NioDatagramChannel中channel读写的对象都是DatagramPacket。而ProtobufDecoder与ProtobufEncoder是将protoBuf对象MessageLiteOrBuilder跟ByteBuf进行转换,所以两者是不能直接结合使用的。
怎么才能在UDP中使用protobuf呢?今天要向大家介绍netty专门为UDP创建的编码解码器DatagramPacketEncoder和DatagramPacketDecoder。
UDP的数据包在netty中是怎么表示呢?
netty提供了一个类DatagramPacket来表示UDP的数据包。netty中的UDP channel就是使用DatagramPacket来进行数据的传递。先看下DatagramPacket的定义:
DatagramPacket继承自DefaultAddressedEnvelope,并且实现了ByteBufHolder接口。
其中的ByteBuf是数据包中需要传输的数据,InetSocketAddress是数据包需要发送到的地址。
而这个DefaultAddressedEnvelope又是继承自AddressedEnvelope:
DefaultAddressedEnvelopee中有三个属性,分别是message,sender和recipient:
这三个属性分别代表了要发送的消息,发送方的地址和接收方的地址。
DatagramPacketEncoder是一个DatagramPacket的编码器,所以要编码的对象就是DatagramPacket。上一节我们也提到了DatagramPacket实际上继承自AddressedEnvelope。所有的DatagramPacket都是一个AddressedEnvelope对象,所以为了通用起见,DatagramPacketEncoder接受的要编码的对象是AddressedEnvelope。
我们先来看下DatagramPacketEncoder的定义:
DatagramPacketEncoder是一个MessageToMessageEncoder,它接受一个AddressedEnvelope的泛型,也就是我们要encoder的对象类型。
那么DatagramPacketEncoder会将AddressedEnvelope编码成什么呢?
DatagramPacketEncoder中定义了一个encoder,这个encoder可以在DatagramPacketEncoder初始化的时候传入:
实际上DatagramPacketEncoder中实现的encode方法,底层就是调用encoder的encode方法,我们来看下他的实现:
上面的逻辑就是从AddressedEnvelope中调用 msgcontent() 方法拿到AddressedEnvelope中的内容,然后调用encoder的encode方法将其编码并写入到out中。
最后调用out的get方法拿出编码之后的内容,再封装到DatagramPacket中去。
所以不管encoder最后返回的是什么对象,最后都会被封装到DatagramPacket中,并返回。
总结一下,DatagramPacketEncoder传入一个AddressedEnvelope对象,调用encoder将AddressedEnvelope的内容进行编码,最后封装成为一个DatagramPacket并返回。
鉴于protoBuf的优异对象序列化能力,我们可以将ProtobufEncoder传入到DatagramPacketEncoder中,做为真实的encoder:
这样就把ProtobufEncoder和DatagramPacketEncoder结合起来了。
DatagramPacketDecoder是和DatagramPacketEncoder相反的 *** 作,它是将接受到的DatagramPacket对象进行解码,至于解码成为什么对象,也是由传入其中的decoder属性来决定的:
DatagramPacketDecoder要解码的对象是DatagramPacket,而传入的decoder要解码的对象是ByteBuf。
所以我们需要一个能够解码ByteBuf的decoder实现,而和protoBuf对应的就是ProtobufDecoder。
先来看下DatagramPacketDecoder的decoder方法是怎么实现的:
可以看到DatagramPacketDecoder的decoder方法很简单,就是从DatagramPacket中拿到content内容,然后交由decoder去decode。
如果使用ProtobufDecoder作为内置的decoder,则可以将ByteBuf对象decode成为ProtoBuf对象,刚好和之前讲过的encode相呼应。
将ProtobufDecoder传入DatagramPacketDecoder也非常简单,我们可以这样做:
这样一个DatagramPacketDecoder就完成了。
可以看到,如果直接使用DatagramPacketEncoder和DatagramPacketDecoder加上ProtoBufEncoder和ProtoBufDecoder,那么实现的是DatagramPacket和ByteBuf直接的互相转换。
当然这里的ProtoBufEncoder和ProtoBufDecoder可以按照用户的需要被替换成为不同的编码解码器。
可以自由组合编码解码方式,就是netty编码器的最大魅力。应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
TCP/IP中的协议
以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:
1. IP
网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。B并不用确定A的端口号,因为UDP本身就是不面向连接的数据传送,所以不存在连接问题。
参考如下:
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
代码如下"
Private Sub Command1_Click()
Winsock1SendData "ok"
End Sub
Private Sub Form_Load()
Winsock1Protocol = sckUDPProtocol
Winsock1LocalPort = 322
Winsock1RemoteHost = "19216812"
Winsock1RemotePort = 322
End Sub
"
当我点击Command1时,出现实时错误:126 没有错误说明
点调试 错误指向Winsock1SendData "ok"
请问这是怎么回事啊
解析:
过去好长时间了握呵呵`希望已经找到你要的答案了吧
亲爱的楼主‘如果没有正确答案‘
谢谢你把分送给我好么‘ ~~~~~~~~``
就当做善事哈‘好人有好报‘
祝你全家人和谐美满‘身体健康哈‘
谢谢
真的是非常感谢`
一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
在现场测控领域,面向的是分布化的控制器、监测器等,其应用场合环境比较恶劣,这样就对待传输数据提出了不同的要求,如实时、抗干扰性、安全性等。
基于此,现场通信中,若某一应用要将一组数据传送给网络中的另一个节点,可由UDP进程将数据加上报头后传送给IP进程,UDP协议省去了建立连接和拆除连接的过程!取消了重发检验机制,能够达到较高的通信速率。
TCP和UDP协议是TCP/IP协议的核心。TCP传输协议:TCP 协议是一TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工 *** 作和多路复用。
通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。
UDP协议是TCP/IP协议的子协议。。当你安装上TCP/IP协议的时候UDP就已经被启用了。
例如QQ。就是使用UDP协议。。。
如果你没安装TCP/IP协议。QQ是无法正常工作的。3UDP
UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。
欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)