一种传输数据的方法及装置转让专利

申请号 : CN201310530769.X

文献号 : CN104601523B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 尚子峰

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种传输数据的方法及装置,属于通信技术领域。所述方法包括:工作线程向终端操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。本发明避免了工作线程在请求数据的过程中被阻塞无法执行其他操作的缺陷,提高了socket连接传输数据的效率。

权利要求 :

1.一种传输数据的方法,其特征在于,所述方法包括:

工作线程向终端的操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;其中,所述异步读取请求中携带有缓冲区地址和回调函数地址;所述缓冲区地址是所述操作系统在接收并存储所述数据后将所述数据转存至所述工作线程对应的应用的缓冲区时所使用的地址;所述回调函数地址是调用所述工作线程执行回调函数处理所述数据时所使用的地址;

所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;

当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。

2.根据权利要求1所述的方法,其特征在于,所述根据所述第一返回值的指示实时检测所述操作系统是否返回消息之后,所述方法还包括:如果检测出所述操作系统返回的用于指示发送心跳信息的第三返回值,则根据所述第三返回值向所述服务器发送心跳信息,以维持所述终端在所述服务器中的在线状态。

3.根据权利要求1所述的方法,其特征在于,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值之后,所述方法还包括:根据所述第二返回值中指示连接断开的参数,判断所述终端与所述服务器之间的连接是否断开;

当确定所述终端与所述服务器之间的连接断开时,重新建立所述终端与服务器之间的连接。

4.根据权利要求1所述的方法,其特征在于,所述根据所述第二返回值的指示处理所述返回的数据之后,所述方法还包括:如果检测出所述操作系统返回的用于指示异步读取操作完成的第四返回值时,则确定所述异步读取操作完成。

5.根据权利要求1所述的方法,其特征在于,所述根据所述第一返回值的指示实时检测所述操作系统是否返回消息之后,所述方法还包括:如果检测出所述操作系统返回的用于指示退出线程操作的第五返回值时,则根据所述第五返回值退出所述工作线程。

6.根据权利要求5所述的方法,其特征在于,所述检测出所述操作系统返回的用于指示退出线程操作的第五返回值之前,所述方法还包括:所述工作线程创建用于控制线程退出的事件对象,所述事件对象的初始状态为未激活状态,以使应用将所述事件对象的状态设置为激活状态时触发退出线程的事件。

7.一种传输数据的装置,其特征在于,所述装置包括:

请求发起模块,用于工作线程向终端的操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;其中,所述异步读取请求中携带有缓冲区地址和回调函数地址;所述缓冲区地址是所述操作系统在接收并存储所述数据后将所述数据转存至所述工作线程对应的应用的缓冲区时所使用的地址;所述回调函数地址是调用所述工作线程执行回调函数处理所述数据时所使用的地址;

执行模块,用于所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;

第一处理模块,用于当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。

8.根据权利要求7所述的装置,其特征在于,所述装置还包括:

第二处理模块,用于如果检测出所述操作系统返回的用于指示发送心跳信息的第三返回值,则根据所述第三返回值向所述服务器发送心跳信息,以维持所述终端在所述服务器中的在线状态。

9.根据权利要求7所述的装置,其特征在于,所述装置还包括:

判断模块,用于根据所述第二返回值中指示连接断开的参数,判断所述终端与所述服务器之间的连接是否断开;

建立模块,用于当确定所述终端与所述服务器之间的连接断开时,重新建立所述终端与服务器之间的连接。

10.根据权利要求7所述的装置,其特征在于,所述装置还包括:

确定模块,用于如果检测出所述操作系统返回的用于指示异步读取操作完成的第四返回值时,则确定所述异步读取操作完成。

11.根据权利要求7所述的装置,其特征在于,所述装置还包括:

退出模块,用于如果检测出所述操作系统返回的用于指示退出线程操作的第五返回值时,则根据所述第五返回值退出所述工作线程。

12.根据权利要求11所述的装置,其特征在于,所述装置还包括:

创建模块,用于所述工作线程创建用于控制线程退出的事件对象,所述事件对象的初始状态为未激活状态,以使应用将所述事件对象的状态设置为激活状态时触发退出线程的事件。

说明书 :

一种传输数据的方法及装置

技术领域

[0001] 本发明涉及通信技术领域,特别涉及一种传输数据的方法及装置。

背景技术

[0002] 随着通信技术的发展,终端和服务器之间建立的网络连接进行数据传输的技术,已经是非常成熟的通信技术。其中,套接字socket是对网络连接中TCP(Transmission Control Protocol,传输控制协议)的封装,通过建立socket连接可以区分来自不同应用进程与网络连接之间的通信。
[0003] 现有技术中,应用在终端与服务器之间建立socket连接后,创建用于传输数据的工作线程,工作线程在接收数据时向操作系统发送接收数据的请求,此时如果服务器返回了数据,则将该数据拷贝回应用的缓存空间并向工作线程返回接收成功的消息,如果服务器未返回数据,则操作系统会等待该返回的数据并不向工作线程返回任何消息,工作线程如果未接收到返回的消息则无法进行其他的传输数据的操作,直到操作系统确认接收到服务器通过socket连接返回数据后,向工作线程返回接收成功的消息,工作线程才可以进行其他发送数据或接收数据的操作。
[0004] 在实现本发明的过程中,发明人发现现有技术至少存在以下问题:
[0005] 工作线程在等待操作系统返回接收成功的消息时,无法进行其他操作,降低了工作线程的效率,会影响数据的利用效率。

发明内容

[0006] 为了解决现有技术的问题,本发明实施例提供了一种传输数据的方法及装置。所述技术方案如下:
[0007] 一方面,提供了一种传输数据的方法,所述方法包括:
[0008] 工作线程向终端操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;
[0009] 所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;
[0010] 当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。
[0011] 另一方面,提供了一种传输数据的装置,所述装置包括:
[0012] 请求发起模块,用于工作线程向终端操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;
[0013] 执行模块,用于所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;
[0014] 第一处理模块,用于当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。
[0015] 通过工作线程向操作系统发起异步读取请求,接收操作系统返回的第一返回值后,执行除异步读取操作以外的其他操作,并根据操作系统发送的通知消息处理服务器返回给终端的数据。避免了工作线程在请求数据的过程中被阻塞无法执行其他操作的缺陷,提高了socket连接传输数据的效率。

附图说明

[0016] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0017] 图1是本发明实施例一提供的传输数据的方法流程图;
[0018] 图2是本发明实施例二提供的传输数据的方法流程图;
[0019] 图3是本发明实施例二提供的传输数据的方法中对工作线程进行实时退出的方法流程图;
[0020] 图4是本发明实施例二提供的传输数据的方法中对终端与服务器之间的连接断开后重连的方法流程图;
[0021] 图5是本发明实施例二提供的传输数据的方法中工作线程向服务器发送心跳信息的方法流程图;
[0022] 图6是本发明实施例三提供的传输数据的装置结构示意图。

具体实施方式

[0023] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
[0024] 实施例一
[0025] 本发明实施例提供了一种传输数据的方法,参见图1,方法流程包括:
[0026] 101:工作线程向终端操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;
[0027] 102:所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;
[0028] 103:当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。
[0029] 本发明实施例通过工作线程向操作系统发起异步读取请求,接收操作系统返回的第一返回值后,执行除异步读取操作以外的其他操作,并根据操作系统发送的通知消息处理服务器返回给终端的数据。避免了工作线程在请求数据的过程中被阻塞无法执行其他操作的缺陷,提高了socket连接传输数据的效率。
[0030] 实施例二
[0031] 本发明实施例提供了一种传输数据的方法,参见图2,方法流程包括:
[0032] 201:工作线程向终端操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据。
[0033] 当应用启动时首先创建用于传输数据的工作线程,并通过工作线程建立终端与服务器之间的套接字socket连接。其中,通过完成与服务器的三次握手完成与服务器建立的socket连接。
[0034] 其中,异步读取请求中携带缓冲区地址和回调函数地址。具体的,异步读取请求为WSARecv()函数来实现,其目的向操作系统发送读取服务器通过建立的socket连接返回的数据,因此在该函数中至少会携带该应用对应的socket的标识,以及缓冲区地址和回调函数地址。
[0035] 其中,终端接收到服务器返回的数据后,先将数据存储于操作系统的缓冲区中,应用如果需要对该数据进行处理,必须要将该数据复制到应用对应的缓冲区,因此异步读取请求中携带的缓冲区地址,则为该应用对应的缓冲区的地址,以指示操作系统,终端在通过应用对应的socket接收到的数据,按照异步读取请求中携带的缓冲区地址进行转存的操作。
[0036] 其中,回调函数地址是一个指针,用于告知操作系统应用对应的回调函数的存储地址。因此,回调函数是一个通过函数指针调用的函数,通过异步读取请求中携带的回调函数地址告知给操作系统,则是将该回调函数的指针地址作为参数传递给操作系统,当操作系统调用该回调函数时,会根据指针地址调用指针地址对应的函数,该指针地址对应的函数是属于发送异步读取请求的应用,其功能是处理服务器返回给终端的数据。进一步的,当终端与服务器之间建立的socket连接断开时,即socket连接断开时,操作系统还可以通过调用回调函数,向应用的工作线程返回一个消息,用于告知应用socket连接断开。
[0037] 202:所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息。
[0038] 具体的,在接收到第一返回值后,通过调用操作系统API(Application Programming Interface,应用程序编程接口)函数:WaitForSingleObjectEx(event,waittime,TRUE),对工作线程进行拥塞控制,此时工作线程处于挂起状态,工作线程会根据调用该函数后,操作系统会根据具体的事件向工作线程返回各种不同的返回值,工作线程再根据不同的返回值解除挂起状态,并进行不同的处理。处理完各种返回值对应的任务后,再次进入挂起状态等待操作系统的返回值。
[0039] 具体的,可以实现工作线程周期性向服务器发送心跳信息的过程,以使服务器获知该发送心跳信息的终端一直为在线状态,因此并不将socket连接断开;还可以实现告知系统是否工作线程自身处于可提醒的状态,如果处于可提醒的状态则操作系统可以向该工作线程发送各种返回值,反之设置为FALSE则不向该工作线程发送返回值;还可以实现对工作进程的实时退出的操作。
[0040] 203:当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。
[0041] 操作系统在接收到服务器返回给终端的数据后,通过异步读取请求中携带的缓冲区地址对数据进行转存。之后调用工作线程根据回调函数地址执行回调函数,用于处理服务器返回给终端的数据,其中调用工作线程的过程为向工作线程发送通知消息以执行回调函数。操作系统会根据回调函数地址传给回调函数传递一些参数,例如:服务器返回给终端的数据的存储地址、服务器返回给终端的数据的大小等。
[0042] 204:如果检测出所述操作系统返回的用于指示异步读取操作完成的第四返回值时,则确定所述异步读取操作完成。
[0043] 当工作线程通过调用回调函数处理完服务器返回给终端的数据后,操作系统根据工作线程调用的WaitForSingleObjectEx(event,waittime,TRUE)函数向工作线程返回WAIT_IO_COMPLETION的返回值,即第四返回值。工作线程接收到该返回值后确认本次的异步读取操作完成,可向操作系统发起下一次的异步读取请求,即重新执行步骤201的过程,进行下一次的等待接收服务器返回数据并进行处理的流程。
[0044] 在本发明实施例中还提供了一种传输数据的方法中对工作线程进行实时退出的方法,参见图3,该方法包括:
[0045] 301:所述工作线程创建用于控制线程退出的事件对象,所述事件对象的初始状态为未激活状态,以使所述应用将所述事件对象的状态设置为激活状态时触发退出线程的事件。
[0046] 工作线程通过调用操作系统的API函数:CreateEvent()创建Event对象,该对象初始状态为未激活状态。
[0047] 302:如果检测出所述操作系统返回的用于指示退出线程操作的第五返回值时,则根据所述第五返回值退出所述工作线程。
[0048] 当需要通知工作线程进行退出时,则调用SetEvent函数将该Event对象的状态更改为激活状态。
[0049] 当应用触发退出线程的事件时,操作系统根据工作线程调用的系统API函数WaitForSingleObjectEx(event,waittime,TRUE)监控到工作线程创建的内核对象Event的状态更改为激活,则操作系统会向工作线程返回WAIT_OBJECT_0的返回值,即第五返回值。
[0050] 工作线程接收到该WAIT_OBJECT_0返回值后,则立即执行退出线程的操作。
[0051] 在本发明实施例中实时退出工作线程的方式,可以弥补Socket阻塞模式过程中,如果工作线程一直在等待服务器返回数据时无法进行退出的缺陷。
[0052] 在本发明实施例中还提供了一种传输数据的方法中对终端与服务器之间的连接断开后重连的方法,参见图4,该方法包括:
[0053] 401:根据所述第二返回值中指示连接断开的参数,判断所述终端与所述服务器之间的连接是否断开。
[0054] 具体的,在终端和服务器之间的连接断开时,操作系统调用工作线程根据回调函数地址执行回调函数,即操作系统会向工作线程发送第二返回值,该第二返回值中指示连接断开的参数是通过操作系统根据回调函数地址传给回调函数中的参数实现的,其中设置服务器返回给终端的数据的大小为“0”或“NULL”时,此时工作线程会判断出终端和服务器之间的连接断开。
[0055] 402:当确定所述终端与所述服务器之间的连接断开时,重新建立所述终端与服务器之间的连接。
[0056] 在本发明实施例中还提供了一种传输数据的方法中对工作线程向服务器发送心跳信息的方法,以维持终端与服务器之间的socket连接,使得终端在服务器保持在线状态,参见图5,该方法包括:
[0057] 501:如果检测出所述操作系统返回的用于指示发送心跳信息的第三返回值,则根据所述第三返回值向所述服务器发送心跳信息,以维持所述终端在所述服务器中的在线状态。
[0058] 其中,工作线程周期性的接收所述操作系统返回的第三返回值。因此,会周期性的向服务器发送心跳信息。
[0059] 具体的,WaitForSingleObjectEx(event,waittime,TRUE)中第二个参数waittime用于进行计时,根据预设的计时时间进行计时,当时间到达时,操作系统向工作线程返回WAIT_TIMEOUT的消息即第三返回值,工作线程在接收到该返回值后,通过socket连接向服务器发送心跳信息。
[0060] 其中,该预设的计时时间可以进行修改,方式可以为但不限于:接收服务器返回的数据中修改计时时间的消息进行修改。
[0061] 进一步的,在步骤201中工作线程调用操作系统API函数:WaitForSingleObjectEx(event,waittime,TRUE),对工作线程进行拥塞控制后,会根据具体的情况接收到不同的返回值(包括:第一返回值,第二返回值,第三返回值,第四返回值,第五返回值)。因此步骤201之后,进行的过程可以执行步骤202-步骤204,或步骤301-步骤302,或步骤401-步骤402,或步骤501中任意一个过程中的流程,这些流程操作之间并没有执行的顺序之分。
[0062] 本发明实施例通过工作线程向操作系统发起异步读取请求,接收操作系统返回的第一返回值后,执行除异步读取操作以外的其他操作,并根据操作系统发送的通知消息处理服务器返回给终端的数据。避免了工作线程在请求数据的过程中被阻塞无法执行其他操作的缺陷,提高了socket连接传输数据的效率。进一步的,根据调用的系统API实现了周期性向服务器发送心跳信息,socket连接中断时实时进行重新连接的过程,进一步的提高了socket连接的工作效率。
[0063] 实施例三
[0064] 本发明实施例提供了一种传输数据的装置,参见图6,该装置包括:
[0065] 请求发起模块601,用于工作线程向终端操作系统发起异步读取请求,以使所述操作系统在接收到服务器返回给所述终端的数据时存储所述数据;
[0066] 执行模块602,用于所述工作线程接收所述操作系统根据所述异步读取请求返回的用于指示检测所述操作系统返回消息的第一返回值,根据所述第一返回值的指示实时检测所述操作系统是否返回消息;
[0067] 第一处理模块603,用于当所述操作系统存储所述服务器返回给所述终端的数据后,所述工作线程如果检测出所述操作系统返回的用于指示处理数据的第二返回值,则根据所述第二返回值的指示处理所述返回的数据。
[0068] 其中,所述装置还包括:
[0069] 第二处理模块604,用于如果检测出所述操作系统返回的用于指示发送心跳信息的第三返回值,则根据所述第三返回值向所述服务器发送心跳信息,以维持所述终端在所述服务器中的在线状态。
[0070] 其中,所述装置还包括:
[0071] 判断模块605,用于根据所述第二返回值中指示连接断开的参数,判断所述终端与所述服务器之间的连接是否断开;
[0072] 建立模块606,用于当确定所述终端与所述服务器之间的连接断开时,重新建立所述终端与服务器之间的连接。
[0073] 其中,所述装置还包括:
[0074] 确定模块607,用于如果检测出所述操作系统返回的用于指示异步读取操作完成的第四返回值时,则确定所述异步读取操作完成。
[0075] 其中,所述装置还包括:
[0076] 退出模块608,用于如果检测出所述操作系统返回的用于指示退出线程操作的第五返回值时,则根据所述第五返回值退出所述工作线程。
[0077] 其中,所述装置还包括:
[0078] 创建模块609,用于所述工作线程创建用于控制线程退出的事件对象,所述事件对象的初始状态为未激活状态,以使所述应用将所述事件对象的状态设置为激活状态时触发退出线程的事件。
[0079] 本发明实施例通过工作线程向操作系统发起异步读取请求,接收操作系统返回的第一返回值后,执行除异步读取操作以外的其他操作,并根据操作系统发送的通知消息处理服务器返回给终端的数据。避免了工作线程在请求数据的过程中被阻塞无法执行其他操作的缺陷,提高了socket连接传输数据的效率。进一步的,根据调用的系统API实现了周期性向服务器发送心跳信息,socket连接中断时实时进行重新连接的过程,进一步的提高了socket连接的工作效率。
[0080] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0081] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0082] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。