一种基于中间件的网络编程通信方法及系统与流程

文档序号:32410355发布日期:2022-12-02 21:20阅读:43来源:国知局
一种基于中间件的网络编程通信方法及系统与流程

1.本发明属于计算机技术领域,具体涉及一种基于中间件的网络编程通信方法及系统。


背景技术:

2.一般的网络编程,不管使用什么编程语言,如果双方需要直接通信,一方必须要知道另外一方的ip和端口号。
3.如果是tcp方式通信,客户端首先调用编程语言提供的建立连接的函数和对方进行连接,函数里面会要求客户端传入服务端的ip和端口号信息;如果连接创建成功,函数会返回一个socket句柄,然后客户端就可以通过这个socket句柄进行读写数据;服务端会接收客户端的连接,如果有客户端连接过来,服务端也会针对该连接产生一个socket句柄,服务端可以通过服务端的socket句柄读写数据和客户端进行通信。
4.如果采取udp方式通信,可以不需要创建连接,一方可以根据另外一方的ip和端口号信息直接将数据发送出去。如果ip和端口号信息错误,或者网络不通,另外一边有可能接收不到该数据包。
5.在大部分场景下,如果通信的双方均处于各自的局域网网络环境中,是无法直接进行通信的,所以需要使用中转的方式进行通信。中转服务器一般部署再云上的公网环境上,由于通信双方均能和云上公网环境进行通信,所以通信双方可以通过使用云上中转服务器中转的方式来进行通信。
6.如图1所示为p2p通信模式,p2p通信底层的传输协议一般采用的是udp方式。如上图所示,有两个peer需要通信,他们都位于各自的nat设备后面,有各自的ip地址和端口号以及socket句柄,需要通过udp方式通信。由于两个peer各自位于各自的nat设备后面,有可能网络不能直通,因此需要向对端peer的ip和端口号发送探测包以及探测应答包进行nat穿透,如果发现网络直接能通或者能够nat穿透成功,则可以通过向对端ip和端口号发送数据来通信。互相通信的数据除了通信双方真正需要的业务数据包之外,还有用于进行nat穿透和穿透应答的数据包,以及其他的一些心跳数据包等。
7.应用层进行编码时候,需要制定详细的数据传输协议来识别上述各种用于不同目的数据包,根据不同的数据包类型来进行不同的处理逻辑,如果希望数据传输还能具有像tcp数据传输那样的完整性以及时序性,还需要处理udp数据包的丢包和乱序的问题。
8.如图2所示为云端中转通信模式。云端部署有一台服务器,该服务器具有公网ip地址,因此peer1和peer2都可以该云端服务器通信,因此peer1和peer2可以通过云端服务器中转数据的方式进行通信。
9.当peer1向peer2发送数据时,peer1先将数据发到云端服务器,并在数据包里面携带peer2的标识信息(比如peer2的登录账号、或者ip和端口号信息、或者连接标识符等),云端服务器收到数据包后,从数据包里面解析出数据包要转发的目的地是peer2,再将数据发送到peer2;反之peer2向peer1发送数据也是类似的通过云端服务器中转。通过云端服务器
中转方式,peer1和peer2就完成了数据通信。
10.采用云端中转方式通信一般用于peer1和peer2的网络不能直接相通通信的场景。从编程角度来看,采用云端中转方式,每个peer也需要处理不同协议的数据包,比如有些数据包是peer和云端服务器本身交互需要用的(比如登录包和心跳包),有些数据包是peer和对端peer通信数据需要的。编程人员必须再代码里面根据不同的数据包类型进行不同的逻辑处理。
11.在实现本发明过程中,发明人发现现有技术中至少存在如下问题:(1)如果两个peer之间需要通信,不管是p2p方式通信,还是云端中转方式通信,创建一个通信管道是一个比较复杂的过程,需要编程人员定义各种不同的协议,识别不同目的的数据包(比如nat探测包,nat探测响应包,和对端peer的心跳包,和云端服务器的登录包等)来处理不同的场景;如果对数据的可靠性以及传输性能有一定的需求,p2p模式下还需要考虑到udp丢包、乱序和流控的问题。处理这些通信问题的代码复杂度和代码量甚至会超过用户本身业务的代码复杂度和工作量。(2)如果两个peer之间需要通信,用户需要知道对端peer的ip和端口号相关信息,这个需要用户开发以及部署云端服务,需要和云端服务交互才能拿到对端peer的ip和端口号相关信息,又带来了额外的工作量。(3)用户的socket句柄会收到各种各样的数据包,用户编程需要考虑各种不同数据包的处理逻辑,还要管理维护底层的通信链路,分散了用户专注处理自身业务数据的时间和精力,极大阻碍了用户的业务开发效率。


技术实现要素:

12.本发明旨在至少在一定程度上解决上述技术问题。为此,本发明目的在于提供一种基于中间件的网络编程通信方法及系统。
13.本发明所采用的技术方案为:
14.一种基于中间件的网络编程通信系统,包括终端、中间件sdk和中转服务器,终端包括用户层,用户层包括句柄fd1,中间件sdk包括引擎层,引擎层包括句柄fd2和句柄fd3,句柄fd2与句柄fd1对应,句柄fd3用于与目标端p2p通信或者与中转服务器中转通信。
15.优选地,还包括登录服务器,登录服务器与终端通信连接。
16.优选地,所述中转服务器和登录服务器均设置在云端服务器上。
17.一种基于中间件的网络编程通信方法,包括以下步骤:
18.对端终端创建与登录服务器之间的第一连接,登录服务器验证对端终端的账号信息,通过后将对端终端账号与第一连接关联;
19.终端向登录服务器发起创建数据通道的请求消息,登录服务器从请求信息中获取对端终端的账号信息,找到关联的第一连接,并将请求消息发送给对端终端;
20.对端终端从请求消息中获取终端的地址信息,并将对端终端的地址信息通过登录服务器返回给终端;
21.通过终端的地址信息和对端终端的地址信息建立p2p通信连接。
22.一种基于中间件的网络编程通信方法,还包括以下步骤:
23.终端向登录服务器发送与对端终端中转通信的请求消息,登录服务器从请求信息中获取对端终端的账号信息,并将请求消息发送给对端终端;
24.对端终端创建和中转服务器的第三连接,并向中转服务器发送接入请求消息,接
入请求消息包括对端终端的账号信息,中转服务器验证通过后将对端终端账号与第三连接关联,并分配给第三连接一个唯一识别码,将唯一识别码返回给对端终端,对端终端通过登录服务器向终端发送响应消息;
25.终端收到响应消息后,创建和中转服务器的第四连接,并向中转服务器发送请求中转消息,请求中转消息包括对端终端的账号信息和唯一识别码,中转服务器验证通过后允许终端接入,并分配给第四连接一个唯一识别码;
26.将两个唯一识别码关联,建立中转通信连接。
27.优选地,登录服务器与终端和/或对端终端之间的协议,以及中转服务器与终端和/或对端终端之间的协议均用动态协商出的密钥加密处理。
28.优选地,所述地址信息包括内外网ip和端口号信息。
29.优选地,所述账号信息包括账号和密码签名信息。
30.本发明的有益效果为:
31.1.本发明所提供的一种基于中间件的网络编程通信方法及系统,中间件向应用层提供了一个代理socket句柄用于读写用户的业务数据,用户可以面向登录账号进行网络编程,不再面向ip地址和端口号进行网络编程。面向登录账号进行网络编程,用户不用考虑登录账号的ip和端口号相关信息,不用再考虑和登录账号的ip、port如何实现通信问题,这些实现细节全都由中间件sdk去处理。用户使用这种方式能更加贴近自己的业务,可以更加专注于自己业务上的通信数据,而不用去考虑底层通信的实现细节,从而为用户带来了极大的编程便利性,显著的提高了用户的编程开发效率。
32.2.本发明用户双方的通信协议可以灵活的自定义。中间件只是将双方的通信数据进行透传,不会去解析通信数据的协议格式,这样方便用户再各种不同的业务场景下使用中间件sdk。
33.3.本发明可以自动为用户提供加密的通信管道传输数据。通信双方的密钥协商由中间件通过diffie-hellman算法来自动实现,应用层无须关注;用户通过中间件接口写入以及读出的数据均是明文,但再网络上传输的却可以是密文。这样一方面可以增加用户的数据安全性,另外一方面对数据的加解密均由中间件sdk自动完成,用户无须关心实现细节,减轻了用户的编程工作量。
34.4.本发明底层通信方式可以通过用户输入参数来灵活确定,用户可以通过参数来指定是使用p2p方式通信(基于udp协议),还是通过服务器中转的方式(基于tcp协议)来进行通信,还是由中间件sdk自行判断来决定使用哪一种方式通信。
35.5.中间件sdk底层如果使用的是p2p方式通信(基于udp协议),也仍然能达到基于tcp通信方式的效果,中间件sdk会自动解决udp的丢包和乱序问题,会根据当前的网路带宽进行自适应的传输流控,应用层无须关注实现细节。
附图说明
36.图1是p2p通信模式的示意图。
37.图2是云端中转通信模式的示意图。
38.图3是本发明基于中间件的网络编程通信系统的示意图。
39.图4是本发明基于中间件的网络编程通信方法的示意图。
40.图5是本发明基于中间件的网络编程通信方法的流程图。
具体实施方式
41.下面将结合本发明中的附图,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
42.应当理解,尽管本文可能使用术语第一、第二等等来描述各种单元,但是这些单元不应当受到这些术语的限制。这些术语仅用于区分一个单元和另一个单元。例如可以将第一单元称作第二单元,并且类似地可以将第二单元称作第一单元,同时不脱离本发明的示例实施例的范围。
43.应当理解,还应当注意到实施例中,所出现的功能/动作可能与附图出现的顺序不同。例如,取决于所涉及的功能/动作,实际上可以实质上并发地执行,或者有时可以以相反的顺序来执行连续示出的两个图。
44.中间件:中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。
45.sdk接口:sdk接口是指软件开发工具包。通常为辅助开发某一类软件的相关文档、范例和工具的集合,作用类似插件,使用sdk可以快速对接某种软件功能,通常出现在对接第三方软件的功能。
46.p2p通信(peer-to-peer):是一种对等网络计算机技术,利用客户端的处理能力,实现客户端的点对点通信。也就是说通信双方可以直接通过网络进行通信,信息无须通过云端服务器或者第三方机器进行信息中转。
47.peer:“peer”在英语里有“对等者、伙伴、对端”的意义,表示通信的一端。
48.中转通信:和p2p通信相反,中转通信是通信双方不通过网络直接进行点对点通信,而是需要通过云端服务器或者第三方机器中转信息来通信。
49.网络穿透:也叫nat穿透、内网穿透。在计算机科学中,nat穿透(nat traversal)涉及tcp/ip网络中的一个常见问题,即让处于使用了nat设备的私有tcp/ip网络中的主机之间可以建立网络连接进行通信。
50.tcp/ip:tcp/ip(transmission control protocol/internet protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。tcp/ip协议不仅仅指的是tcp和ip两个协议,而是指一个由ftp、smtp、tcp、udp、ip等协议构成的协议簇,只是因为在tcp/ip协议中tcp协议和ip协议最具代表性,所以被称为tcp/ip协议。
51.ip地址:ip地址是ip协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
52.port(端口号):port是一种接口,数据通过它在计算机和其它设备(如打印机、鼠标、键盘或监视器)之间、网络之间或和其它直接连接的计算机之间传递。在编程里,端口是一种“逻辑连接位置”,可以用来区分不同的网络服务。
53.tcp:传输控制协议(tcp,transmission control protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
54.udp:internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(udp,user datagram protocol)。udp为应用程序提供了一种无需建立连接就可以发送封装的ip数据包的方法。相对于tcp协议,udp是一种不可靠的传输协议,即发送端发送的数据,接收端不一定能收到或者是收到的包的顺序和发送端的不一致。
55.socket编程:socket编程就是套接字编程,实现客户端和服务端之间的通信,而tcp就是客户端和服务端之间进行通信的一个约定。客户端创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器也会创建一个只针对对该客户端的socket对象,这样客户端和服务器之间就通过socket对象的写入和读取来进行通信了。
56.nat:是指网络地址转换(network address translation)。
57.本实施例的一种基于中间件的网络编程通信系统,包括终端peer、中间件sdk、中转服务器和登录服务器,中转服务器和登录服务器均设置在云端服务器上,登录服务器与终端peer通信连接,终端peer包括用户层,用户层包括句柄fd1,中间件sdk包括引擎层,引擎层包括句柄fd2和句柄fd3,句柄fd2与句柄fd1对应,句柄fd3用于与目标端p2p通信或者与中转服务器中转通信。
58.如图3所示,peer1和peer2为需要通信的两个终端程序,中间件sdk运行在客户端进程之内,当终端需要和对端终端创建通信管道时,用户需要调用中间件sdk的创建连接接口,接口里面有对端终端的登录账号以及需要使用的通信模式(云端中转方式通信或p2p方式通信),创建通信管道的过程由中间件sdk内部去处理,用户无须关心。当通信管道创建成功之后,接口会返回给用户的业务层一个tcp的socket句柄,标识为句柄fd1(该句柄可以理解为一个数据代理的句柄),同时中间件sdk内部也会有产生一个tcp的socket句柄fd2用于和句柄fd1对应,句柄fd1写入数据句柄fd2可以读出,句柄fd2写入数据句柄fd1可以读出,同时还产生一个中间件sdk内部真正和对端peer进行通信的句柄fd3,句柄fd3可以是tcp句柄,也可以是udp句柄,看具体的实现来决定,例如在中转通信模式下,句柄fd3为tcp句柄,在p2p通信模式下,句柄fd3为udp句柄。
59.当终端要向对端终端发送数据时候,通过用户层将业务数据写入到句柄fd1,即为消息1,此时中间件sdk会从句柄fd2读到用户的业务数据,然后通过句柄fd3将数据用协议再封装一层后发送出去,该协议里面会写入对端终端的账号信息。
60.如果是云端中转通信模式,句柄fd3将数据发送到中转服务器,即为消息2,中转服务器收到数据之后从数据包里面解析出对端终端账号信息,将数据发送到指定的终端。如果是p2p方式通信,句柄fd3可以直接将数据发送到对端终端,无须通过云端服务器中转,即为消息3的直接通信。
61.当中间件sdk的句柄fd3收到数据包时,此时会有各种各样的数据包,但只有用户的业务数据才需要返回给用户,其他的一些数据包在中间件sdk内部进行处理和消化掉(比如登录云端的登录响应包,心跳包,nat穿透和应答包等);句柄fd3会对这些数据包进行不同的业务逻辑处理,仅当发现是需要传输给用户的业务数据时,会将用户的业务数据抽取出来,将用户的业务数据写入到句柄fd2,此时用户从句柄fd1读到业务数据。
62.通过中间件将数据通道的创建和管理剥离出来之后,用户可以把精力集中于业务数据的处理上面,不用关心底层数据通道的创建和管理细节,可以极大的提高编程效率。并且中间件sdk向用户提供了一个代理的socket句柄(句柄fd1)来读写自己的业务数据,用户
可以用原生的编程语言提供的各种网络相关的函数来管理和控制这个socket代理句柄,可以使业务层代码和sdk层代码很好的互相解耦。用户通过使用这种方式达到的效果,就是面向登录账号进行网络编程,摒弃了原先的面向ip和port进行网络编程,只用关注自己的业务数据,使用起来更加简单和直接。
63.如图4和图5所示,本实施例的一种基于中间件的网络编程通信方法,采用上述的网络编程通信系统,以终端peer1向对端终端peer2请求建立连接,peer2需要接收连接请求的场景为例,包括以下步骤:
64.peer2根据登录服务器的ip和端口号创建一个和登录服务器之间网络连接(第一连接,即连接1),然后向登录服务器发送登录请求,登录请求包括peer2的账号和密码签名信息。登录服务器对peer2的账号和密码签名信息进行验证通过之后,允许peer2进行登录,并在内部将peer2的账号信息和连接1关联起来。
65.peer1根据登录服务器的ip和端口号创建一个和登录服务器之间网络连接(第二连接,即连接2),peer1向登录服务器发起向peer2创建数据通道的请求,该请求消息包含了peer2的账号信息,以及peer1的socket句柄fd3的内外网ip和端口号信息;登录服务器从请求信息中获取到peer2的登录账号,然后根据登录账号找到关联的连接1,最后将请求通过连接1发送给peer2。
66.peer2收到peer1的连接请求之后,从请求消息中获取到peer1的句柄fd3的内外网ip和内外网端口号信息,同时将自身的句柄fd3的内外网ip地址和内外网端口号返回给登录服务器,登录服务器将该响应信息返回给peer1。
67.peer1和peer2都知道了对端peer的内外网ip地址和内外网端口号,因此可以尝试是否能和对端的ip地址和端口号直接连接通信,如果网络不通,再尝试nat穿透,看是否能网络穿透成功。如果网络能通或者经过穿透之后也能通,则建立p2p通信连接。
68.如果无法通过p2p方式通信,则peer1向登录服务器发送请求与peer2中转通信的请求,该请求消息包含peer2的账号信息,登录服务器将请求消息转发给peer2。
69.peer2收到peer1的中转消息之后,创建和中转服务器的连接(第三连接,即连接3),同时通过连接3向中转服务器发送请求中转的接入请求,请求信息中包含peer2的账号和密码签名信息,中转服务器收到请求之后,验证peer2的账号和密码签名信息,如果验证通过,则将连接3和peer2的账号进行绑定关联,并分配给连接3一个uuid标识号,最后将连接3的uuid标识号返回给peer2。peer2通过登录服务器向peer1发送请求中转的响应消息,响应消息中携带有连接3的uuid标识号。
70.peer1收到请求中转的响应消息,peer1收到peer2用于中转的连接3的uuid标识号之后,也和中转服务器创建连接(第四连接,即连接4),并通过连接4发送请求中转的消息,该消息中携带有peer2的账号以及peer2的连接3的uuid标识号,中转服务器收到中转请求之后,对peer2的账号以及peer2的连接3的uuid标识号进行校验,如果校验通过,则允许peer1接入,同时也为peer1的连接4再内部分配一个uuid标识号,并将连接3的uuid标识号和连接4的uuid标识号进行关联,建立中转通信连接,表示连接3和连接4是一对中转连接。连接3收到的数据要通过连接4发送给peer2,连接4收到的数据要通过连接3发送给peer1,peer1通过连接3写入的数据,中转服务器会通过连接4转发给peer2;peer2通过连接4写入的数据,中转服务器会通过连接3转发给peer1,因此peer1和peer2就可以通过服务器中转
方式通信。
71.peer与登录服务器之间的协议以及peer与中转服务器之间的协议均用动态协商出的密钥加密处理,这样可以保护数据的安全性。通过上述的基于中间件的网络编程通信方法,两个peer之间的通信管道最终创建出来了,要么是p2p方式通信管道,要么是中转方式管道。如果是基于udp传输报文的p2p通信方式,中间件sdk还需要处理udp的丢包和乱序问题,以及实现根据网络带宽进行自适应的传输流控。
72.上述创建两个peer之间通信管道过程全都由中间件sdk和云端服务器交互处理完成,应用层代码无须关心内部的实现和细节,应用层代码只需要调用中间件sdk的创建连接接口即可,只需要再接口中传入对端peer的账号以及所需要创建的通道类型即可。
73.本发明的一种基于中间件的网络编程通信方法及系统,用户通过中间件sdk创建的通信管道的句柄fd1写入以及读出的数据就是用户自己本身的业务数据,不涉及到创建和维护通信管道的其他的数据包(比如探测包,心跳包,登录包等),这样可以使得编程人员更加专注于自己的业务代码开发,不用去关注底层通信管道的创建和管理实现细节,极大的提高了开发效率。
74.该中间件是一套通用的中间件,底层不仅支持p2p传输,也支持中转传输,编程人员只需要再中间件sdk的接口里面传入一个参数即可创建出自己想需要的通信模式。该中间件对外表现形式类似于tcp通信,对用户的数据协议不做任何要求,方便编程用户制定各种不同的应用层的私有协议。
75.该中间件将底层创建和管理通信管道的能力抽象和提炼出来,凡是使用该中间件的编程用户都能通过指定目标peer的登录账号(比如登录的设备id),而不是ip和端口号信息,就能创建出一条和对端peer的通信管道进行通信,极大的提高了开发效率,为用户带来了价值。
76.本发明不局限于上述可选实施方式,任何人在本发明的启示下都可得出其他各种形式的产品,但不论在其形状或结构上作任何变化,凡是落入本发明权利要求界定范围内的技术方案,均落在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1