一种数据通信方法、装置及系统的制作方法

文档序号:7997800阅读:231来源:国知局
一种数据通信方法、装置及系统的制作方法
【专利摘要】本发明适用于网络【技术领域】,提供了一种数据通信方法、装置及系统,包括:创建N个端口通道,将所述N个端口通道注册到选择器中,所述N为大于等于1的整数;通过所述选择器监听所述N个端口通道中的M个第一端口通道对应的端口事件,所述M个第一端口通道为分别与M个通信对端建立连接的端口通道,所述M为大于等于1且小于等于N的整数;根据监听到的端口事件执行数据收发操作;在所述数据收发操作完成之后,断开执行所述数据收发操作的第一端口通道与其对应的通信对端的连接。本发明基于JDK实现端口通道的多路复用,提供了一种高性能的数据通信网络框架,基于该网络框架,能够实现机器之间的多线程、高效率的数据通信。
【专利说明】一种数据通信方法、装置及系统

【技术领域】
[0001]本发明属于网络【技术领域】,尤其涉及一种数据通信方法、装置及系统。

【背景技术】
[0002]在计算机数据通信过程中,对于单线程的通信方式,在同一时刻只能有一个客户端成功创建连接,并且直到该客户端通信完成后其他客户端才能与服务器进行连接、通信,若当前正在连接的客户端的通信过程占用了很长时间,将导致其他客户端连接超时。
[0003]对于多线程的通信方式,由服务器首先创建多个线程,其中一个为主线程,负责服务器与客户端之间网络连接的建立,其他线程为从线程,负责跟已连接的每个客户端进行数据通信。在上述多线程通信过程中,如果在同一时刻有大量的客户端与服务器进行通信,将导致主线程负荷过大,严重影响了通信效率。
[0004]因此,综上所述,现行的单线程以及多线程的通信方式通信效率低下,影响了数据通信系统的性能。


【发明内容】

[0005]本发明实施例提供一种数据通信方法,解决现行的单线程以及多线程的通信方式通信效率低下,影响了数据通信系统的性能的问题。
[0006]本发明实施例是这样实现的,一种数据通信方法,包括:
[0007]创建N个端口通道,将所述端口通道注册到选择器中,所述N为大于等于I的整数;
[0008]通过所述选择器监听N个所述端口通道中的M个第一端口通道,所述第一端口通道为与通信对端建立了连接的所述端口通道,所述M为大于等于I且小于等于N的整数;
[0009]根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作;
[0010]在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接。
[0011]本发明实施例的另一目的在于提供一种数据通信装置,包括:
[0012]创建单元,用于创建N个端口通道,将所述端口通道注册到选择器中,所述N为大于等于I的整数;
[0013]监听单元,用于通过所述选择器监听N个所述端口通道中的M个第一端口通道,所述第一端口通道为与通信对端建立了连接的所述端口通道,所述M为大于等于I且小于等于N的整数;
[0014]执行单元,用于根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作;
[0015]连接断开单元,用于在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接
[0016]本发明实施例的另一目的在于提供一种数据通信系统,包括数据处理器和如上所述的数据通信装置;
[0017]所述数据处理器用于处理所述数据通信装置产生的回调。
[0018]本发明实施例基于JDK实现端口通道的多路复用方案,提供了一种高性能的数据通信网络框架,基于该网络框架,能够实现机器之间的多线程、高效率的数据通信。

【专利附图】

【附图说明】
[0019]图1是本发明实施例提供的数据通信方法的实现流程图;
[0020]图2是本发明实施例提供的数据通信方法步骤S204的具体实现流程图;
[0021]图3是本发明另一实施例提供的数据通信方法步骤S204的具体实现流程图;
[0022]图4是本发明实施例提供的数据通信装置的结构框图;
[0023]图5是本发明另一实施例提供的数据通信装置的结构框图;
[0024]图6是本发明实施例提供的数据通信系统的结构框图。

【具体实施方式】
[0025]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0026]本发明实施例基于Java开发工具库(Java Develop Toolkit, JDK)实现端口通道的多路复用,提供了一种高性能的数据通信网络框架,基于该网络框架,能够实现机器之间的多线程、高效率的数据通信。
[0027]图1示出了本发明实施例提供的数据通信方法的实现流程图,详述如下:
[0028]在步骤SlOl中,创建N个端口通道,将所述端口通道注册到选择器中,所述N为大于等于I的整数。
[0029]执行步骤SlOl之前,可以使用JDK中的Selector, open函数来创建选择器(Selector),通过创建选择器,能够在通信端实现多个端口通道,从而保证通信端具备多线程通信的能力。
[0030]具体地,首先,可以通过以下指令创建多个端口通道:
[0031]对于传输控制协议(Transit1nControl Protocal, TCP):
[0032]ServerSocketChannel.0pen ();
[0033]对于用户数据报文协议(UserDatagram Protocal, UCP):
[0034]DatagramChanne1.0pen ();
[0035]其次,在创建了多个端口通道之后,进行端口绑定:
[0036]对于TCP:
[0037]ServerSocketChannel.socket ( ).bind ();
[0038]对于UCP:
[0039]DatagramChanne1.socket ( ).bind ();
[0040]最后,将端口通道注册到选择器上:
[0041]对于TCP:
[0042]ServerSocketChannel.register ();
[0043]对于UCP:
[0044]DatagramChanne1.register ()。
[0045]作为本发明的一个实施例,可以将多个端口通道均注册到一个选择器上,以实现对多个端口通道的端口事件进行同时监听。
[0046]在步骤S102中,通过所述选择器监听N个所述端口通道中的M个第一端口通道,所述第一端口通道为与通信对端建立了连接的所述端口通道,所述M为大于等于I且小于等于N的整数。
[0047]在本实施例中,通过JDK中的选择器,能够对所有注册在选择器下的第一端口通道进行监听,其中,第一端口通道为注册在选择器下的、已经同通信对端建立了连接的端口通道。在本实施例中,连接的建立是通过在步骤SlOl之后,步骤S102之前,由作为客户端的通信端发起连接请求,作为服务器的通信端在收到连接请求后,从连接请求中获知端口通道,从而通过该端口通道建立起与客户端的连接。
[0048]需要说明的是,当服务器与客户端采用TCP协议来传输数据时,则需要服务器单独创建一个选择器,并通过定期轮询的方式来监听该选择器中是否有连接事件产生。当监听到有连接事件产生时,则调用serverSocketChannel.accept方法,并且把该端口通道分配给用于监听读事件的选择器,由此创建会话,并将创建的会话用attach方法关联到SocketChannel 上。
[0049]在步骤S103中,根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作。
[0050]在本实施例中,监听到的端口事件包括读事件或者写事件,在本发明后续实施例中,将分别对上述两种事件的处理过程进行详细阐述,在此不再赘述。
[0051]在步骤S104中,在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接。
[0052]在本实施例中,对于与通信对端的连接的第一端口通道,在断开与通信对端的连接之后,使得本端可以回收该端口通道资源,用于其他线程的通信。具体地,步骤S104可以通过依次调用以下三个函数来实现:
[0053]Select1nKey.cancel ();
[0054]Select1nKey.attach (null);
[0055]SocketChannel.close () (TCP 协议),或者 DatagramChannel.close () (UDP 协议)。
[0056]作为本发明的一个实施例,通过设置定时器,在每进行完一次端口通道的数据收发操作之后,都会开始计时,判断该端口通道是否在预设时间内再无数据收发,如果是的话则认为该端口通道与通信对端的读写操作完成,断开该端口通道与其对应的通信对端的连接。
[0057]作为本发明的一个实施例,步骤S103中通过选择器监听到第一端口通道的读事件,则如图2所示,步骤S103具体为:
[0058]在步骤S201中,根据监听到的所述第一端口通道的读事件,调用读方法读取该第一端口通道对应的通信对端发送的数据。
[0059]例如,可以调用JDK中的SocketChannel.read方法来读取该第一端口通道对应的通信发送的数据。
[0060]在步骤S202中,获取来自所述读方法的第一返回值。
[0061]具体地,可以使用JDK中的SocketChannel.read方法来读取通信对端发送来的数据,并根据SocketChannel.read方法针对此次读取操作产生的返回值来决定是否继续接收数据。
[0062]在步骤S203中,若所述第一返回值大于0,继续通过该第一端口通道读取与其对应的通信对端发送的数据。
[0063]若第一返回值大于0,则表示还有来自该通信对端的数据未读取完毕,则继续通过该第一端口通道读取数据。
[0064]在本实施例中,当还有来自通信对端的数据未读取完毕时,除了读取剩余数据之夕卜,还需要根据第一返回值的大小来确定剩余数据的大小,从而根据剩余数据的大小来调整读取缓冲区的大小,完成剩余数据的读取。
[0065]而对于UDP协议来说,在步骤S203中,当读方法返回的通信对端的地址不为空,则继续通过该第一端口通道读取对应的通信对端发送的数据。
[0066]在步骤S204中,若所述第一返回值等于0,停止通过该第一端口通道读取与其对应的通信对端发送的数据。
[0067]在本实施例中,若第一返回值等于0,则表示当前不存在来自该通信对端的可读数据,则结束此次该第一端口通道的读取操作。
[0068]对于UDP协议来说,在步骤S204中,当读方法返回的通信对端的地址为空,则结束该第一端口通道的读取操作。
[0069]在步骤S205中,若所述第一返回值小于0,则确定该第一端口通道的数据收发操作完成。
[0070]在本实施例中,若第一返回值小于0,则确定其通信对端已关闭了相应端口通道,那么在本通信端也由此确定该第一端口通道的数据收发操作完成,从而执行步骤S104,SP在数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接。
[0071]对于UDP协议来说,在步骤S205中,当读方法返回的通信对端的地址为空,则也确定所述数据收发操作完成。
[0072]具体地,可以调用JDK中的SocketChannel.close方法来断开该第一端口通道与其对应的通信对端的连接。
[0073]需要说明的是,在上述读操作过程中,若读方法未返回上面任一种情况的返回值,则认为此次读取操作异常,也需要断开该第一端口通道与其对应的通信对端的连接。
[0074]作为本发明的一个实施例,步骤S103中通过选择器监听到第一端口通道的写事件,则如图3所示,步骤S103具体为:
[0075]在步骤S301中,根据监听到的所述第一端口通道的写事件,调用写方法,通过该第一端口通道向对应的通信对端发送数据。
[0076]例如,可以调用JDK中的SocketChannel.write方法来通过该第一端口通道向对应的通信对端发送数据。
[0077]在步骤S302中,获取来自所述写方法的第二返回值。
[0078]具体地,可以使用JDK中的SocketChannel.write方法来向通信对端发送数据,并根据SocketChannel.write方法针对此次写操作产生的返回值来获知数据的发送情况。
[0079]在步骤S303中,当所述第二返回值与发送数据的数据长度相同,若还有数据需要发送给该通信对端,则通过该第一端口通道继续向该通信对端发送数据。
[0080]在步骤S304中,当所述第二返回值等于0,若还有数据需要发送给该通信对端,调用注册方法向所述选择器中再次注册所述第一端口通道的写事件,以在再次注册的写事件触发后通过该第一端口通道继续向该通信对端发送数据。
[0081]其中,注册方法可以为JDK中的Select1nkey.1nterestOps方法。
[0082]在本实施例中,当第二返回值等于O时,表明本通信端的写缓冲区已满,需要等待写缓冲区空闲后才能再进行写操作,因此,向选择器再次注册该第一端口通道的写事件,以在再次注册的写事件触发后通过该第一端口通道继续向该通信对端发送数据。
[0083]需要说明的是,在上述写操作过程中,若写方法未返回上面任一种情况的返回值,则认为此次读取操作异常,也需要断开该第一端口通道与其对应的通信对端的连接。
[0084]图4示出了本发明实施例提供的数据通信装置的结构框图,该装置可以用于运行本发明图1至图3实施例所述的数据通信方法。为了便于说明,仅示出了与本实施例相关的部分。
[0085]参照图4,该装置包括:
[0086]创建单元41,创建N个端口通道,将所述端口通道注册到选择器中,所述N为大于等于I的整数。
[0087]监听单元42,通过所述选择器监听N个所述端口通道中的M个第一端口通道,所述第一端口通道为与通信对端建立了连接的所述端口通道,所述M为大于等于I且小于等于N的整数。
[0088]执行单元43,根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作。
[0089]连接断开单元44,在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接。
[0090]可选地,所述创建单元41具体用于将N个所述端口通道注册到同一个选择器中。
[0091]可选地,如图5所示,所述执行单元43包括:
[0092]读方法调用子单元431,根据监听到的所述第一端口通道的读事件,调用读方法读取该第一端口通道对应的通信对端发送的数据。
[0093]读事件执行子单元432,获取来自所述读方法的第一返回值;若所述第一返回值大于0,读事件执行子单元432继续通过该第一端口通道读取与其对应的通信对端发送的数据;若所述第一返回值等于0,读事件执行子单元432停止通过该第一端口通道读取与其对应的通信对端发送的数据;若所述第一返回值小于0,读事件执行子单元432确定该第一端口通道的数据收发操作完成。
[0094]可选地,如图5所示,所述执行单元43包括:
[0095]写方法调用子单元433,根据监听到的所述第一端口通道的写事件,调用写方法,通过该第一端口通道向对应的通信对端发送数据。
[0096]写事件执行子单元434,获取来自写方法的第二返回值;当所述第二返回值与发送数据的数据长度相同,若还有数据需要发送给该通信对端,则写事件执行子单元434通过该第一端口通道继续向该通信对端发送数据;当所述第二返回值等于O,若还有数据需要发送给该通信对端,写事件执行子单元434调用写方法向所述选择器中再次注册所述第一端口通道的写事件,以在再次注册的写事件触发后通过该第一端口通道继续向该通信对端发送数据。
[0097]可选地,如图5所示,所述连接断开单元44包括:
[0098]判断子单元441,判断该第一端口通道在预设时间内是否再无数据收发操作。
[0099]连接断开子单元442,当该第一端口通道在所述预设时间内再无数据收发操作,断开该第一端口通道与其对应的通信对端的连接。
[0100]图6示出了本发明实施例提供的数据通信系统的结构框图,为了便于说明,仅示出了与本实施例相关的部分。
[0101]在本实施例中,该数据通信系统包括如本发明图4和图5实施例所述的数据通信装置,如图6所示,其可以以网络处理器61的形式存在于该系统中,同时,该系统还包括了数据处理器62,其中:
[0102]网络处理器61采用多线程进行多端口监听,用于负责进行包括数据收发、端口管理、超时检测等在内的与通信对端的网络通信相关动作,其具体实现方式可以参照本发明图4和图5所述实施例,在此不再赘述。
[0103]数据处理器62负责在与通信对端进行通信的过程中连接创建、连接关闭、通信异常、收到数据时的回调触发,例如,上述实施例中调用SocketChannel.read方法或者SocketChannel.write方法所产生的回调。且为了通信效率考虑,数据处理器62采用数量可控并且跟网络线程分离的线程池。
[0104]可选地,该系统还可以包括编解码器63,编解码器63同时与网络处理器61与数据处理器62连接,负责将在网络中传输的二进制数据转换成可供数据处理器62处理的数据格式,同时负责将数据处理器62处理完毕的数据转换成可供网络传输的二进制数据。
[0105]在本实施例中,编解码器63在编码时提供Java对象序列化的方法,在解码时提供Java对象返序列化的方法,为了不影响网络处理器的工作,在编码时将序列化的数据放到一个并发队列(采用JDK提供的ConcurrentLinkedQueue类中),网络处理器61在处理写事件的时候会把序列化的数据发送出去,在此,并发队列的作用是用于解耦网络处理器和数据处理器,保证模块间数据处理的高效性。
[0106]需要说明的是,在本实施例中,如图6所示,网络处理器61和数据处理器62均采用多线程进行处理,且均位于各自的受控线程池内,以满足多线程通信的需求。
[0107]本发明实施例基于JDK实现端口通道的多路复用方案,提供了一种高性能的数据通信网络框架,基于该网络框架,能够实现机器之间的多线程、高效率的数据通信。
[0108]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种数据通信方法,其特征在于,包括: 创建N个端口通道,将所述端口通道注册到选择器中,所述N为大于等于I的整数; 通过所述选择器监听N个所述端口通道中的M个第一端口通道,所述第一端口通道为与通信对端建立了连接的所述端口通道,所述M为大于等于I且小于等于N的整数; 根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作; 在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接。
2.如权利要求1所述的方法,其特征在于,所述将N个所述端口通道注册到选择器中包括: 将N个所述端口通道注册到同一个选择器中。
3.如权利要求1所述的方法,其特征在于,所述根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作包括: 根据监听到的所述第一端口通道的读事件,调用读方法读取该第一端口通道对应的通信对端发送的数据; 获取来自所述读方法的第一返回值; 若所述第一返回值大 于O,继续通过该第一端口通道读取与其对应的通信对端发送的数据; 若所述第一返回值等于O,停止通过该第一端口通道读取与其对应的通信对端发送的数据; 若所述第一返回值小于O,确定该第一端口通道的数据收发操作完成。
4.如权利要求1所述的方法,其特征在于,所述根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作包括: 根据监听到的所述第一端口通道的写事件,调用写方法,通过该第一端口通道向对应的通信对端发送数据; 获取来自所述写方法的第二返回值; 当所述第二返回值与发送数据的数据长度相同,若还有数据需要发送给该通信对端,则通过该第一端口通道继续向该通信对端发送数据; 当所述第二返回值等于O,若还有数据需要发送给该通信对端,调用注册方法向所述选择器中再次注册所述第一端口通道的写事件,以在再次注册的写事件触发后通过该第一端口通道继续向该通信对端发送数据。
5.如权利要求1所述的方法,其特征在于,所述在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接包括: 判断该第一端口通道在预设时间内是否再无数据收发操作; 当该第一端口通道在所述预设时间内再无数据收发操作,断开该第一端口通道与其对应的通信对端的连接。
6.一种数据通信装置,其特征在于,包括: 创建单元,用于创建N个端口通道,将所述端口通道注册到选择器中,所述N为大于等于I的整数; 监听单元,用于通过所述选择器监听N个所述端口通道中的M个第一端口通道,所述第一端口通道为与通信对端建立了连接的所述端口通道,所述M为大于等于I且小于等于N的整数; 执行单元,用于根据监听到的所述第一端口通道的端口事件执行该第一端口通道的数据收发操作; 连接断开单元,用于在所述数据收发操作完成之后,断开该第一端口通道与其对应的通信对端的连接。
7.如权利要求6所述的装置,其特征在于,所述创建单元具体用于将N个所述端口通道注册到同一个选择器中。
8.如权利要求6所述的装置,其特征在于,所述执行单元包括: 读方法调用子单元,用于根据监听到的所述第一端口通道的读事件,调用读方法读取该第一端口通道对应的通信对端发送的数据; 读事件执行子单元,用于获取来自所述读方法的第一返回值;若所述第一返回值大于O,所述读事件执行子单元继续通过该第一端口通道读取与其对应的通信对端发送的数据;若所述第一返回值等于O,所述读事件执行子单元停止通过该第一端口通道读取与其对应的通信对端发送的数据;若所述第一返回值小于O,所述读事件执行子单元确定该第一端口通道的数据收发操作完成。
9.如权利 要求6所述的装置,其特征在于,所述执行单元包括: 写方法调用子单元,用于根据监听到的所述第一端口通道的写事件,调用写方法,通过该第一端口通道向对应的通信对端发送数据; 写事件执行子单元,用于获取来自写方法的第二返回值;当所述第二返回值与发送数据的数据长度相同,若还有数据需要发送给该通信对端,则所述写事件执行子单元通过该第一端口通道继续向该通信对端发送数据;当所述第二返回值等于O,若还有数据需要发送给该通信对端,所述写事件执行子单元调用写方法向所述选择器中再次注册所述第一端口通道的写事件,以在再次注册的写事件触发后通过该第一端口通道继续向该通信对端发送数据。
10.如权利要求6所述的装置,其特征在于,所述连接断开单元包括: 判断子单元,用于判断该第一端口通道在预设时间内是否再无数据收发操作; 连接断开子单元,用于当该第一端口通道在所述预设时间内再无数据收发操作,断开该第一端口通道与其对应的通信对端的连接。
11.一种数据通信系统,其特征在于,包括数据处理器和如权利要求6~10任一项所述的数据通信装置; 所述数据处理器用于处理所述数据通信装置产生的回调。
12.如权利要求11所述的系统,其特征在于,所述系统还包括: 编解码器,用于执行所述数据通信装置和所述数据处理器之间的数据格式转换。
【文档编号】H04L5/00GK104079398SQ201310104766
【公开日】2014年10月1日 申请日期:2013年3月28日 优先权日:2013年3月28日
【发明者】张春玮 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1