本发明涉及通信技术领域,尤其涉及一种基于多查询线程的通信方法及其系统。
背景技术:
在一般网络服务端应用中,只要不是处理大规模的连接,就可以选择select模型的网络结构,大家一般都是这样认为的,因为select模型的网络结构,看起来是一个单线程的处理逻辑,需要循环地对套接字(socket)进行select查询,有消息来,select线程就会返回,并继续后面的操作,整个过程是一个流水线的机制,接受连接,收消息,发消息,都占用了单线程的时间片,而且一个线程的select一次只能处理64个套接字,在连接数超过64个的时候,消息处理的效率大大降低。
在公开号为CN104683460A的中国专利公开文件中,公开了一种物联网的通信方法,包括:设置多个第一选择器Selector,以从连接队列中多线程接收连接请求;根据多个第一Selector接收数据的数量,确定一个第一Selector接收当前处于连接队列最前端的连接请求;根据连接请求建立与设备侧的连接。但该方案采用多线程接收连接请求,增加了线程的切换系统消耗的时间,且采用同一线程进行套接字的监听、接受连接和查询,会消耗线程的性能。
技术实现要素:
本发明所要解决的技术问题是:提出一种基于多查询线程的通信方法及其系统,提升查询线程对连接套接字的查询速度,从而提升服务器的性能。
为了解决上述技术问题,本发明采用的技术方案为:一种基于多查询线程的通信方法,包括:
创建一个监听套接字,并将其与服务器的IP地址以及所述服务器的一个可用端口绑定;
创建两个以上的查询线程、两个以上的数据处理线程和一个接受连接线程;
接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程;
各查询线程接收所述连接套接字,并存入各自的查询套接字队列;
依据一查询线程可处理的最大连接套接字数量,各查询线程从各自的查询套接字队列中依序循环取出一组连接套接字;
接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理。
本发明还涉及一种基于多查询线程的通信系统,包括:
第一创建模块,用于创建一个监听套接字,并将其与服务器的IP地址以及所述服务器的一个可用端口绑定;
第二创建模块,用于创建两个以上的查询线程、两个以上的数据处理线程和一个接受连接线程;
分发模块,用于接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程;
存入模块,用于各查询线程接收所述连接套接字,并存入各自的查询套接字队列;
取出模块,用于依据一查询线程可处理的最大连接套接字数量,各查询线程从各自的查询套接字队列中依序循环取出一组连接套接字;
第一放入模块,用于接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理。
本发明的有益效果在于:利用多查询线程的机制来扩展select的能力,原来一个查询线程可以处理64个连接套接字,则n个查询线程则可以同时处理64*n个连接套接字的并发数据,提高了套接字查询的效率,从而提高了消息处理的速度;只设置一个接受连接线程来负责接受客户端的连接和连接套接字的分发,相比设置多个接受连接线程来说,减少了切换线程所消耗的时间,提高了连接处理效率;且套接字分发和套接字查询由不同的线程进行处理,节约了线程的性能;同时,通过接受连接线程将连接套接字分发至各查询线程,各查询线程循环查询自身查询套接字队列中的连接套接字,保证所有的连接套接字都能被查询,也保证所有的连接套接字都只会在某一个查询线程中被查询,查询线程的查询套接字队列中的套接字对象是唯一独立的,多线程互相的资源不存在共享访问,无需加锁操作,提升了多线程查询的并发处理速度。
附图说明
图1为本发明一种基于多查询线程的通信方法的流程图;
图2为本发明实施例一的方法流程图;
图3为本发明实施例二的步骤S3的流程图;
图4为本发明实施例三的方法流程图;
图5为本发明一种基于多查询线程的通信系统的结构示意图;
图6为本发明实施例四的系统结构示意图。
标号说明:
1、第一创建模块;2、第二创建模块;3、分发模块;4、存入模块;5、取出模块;6、第一放入模块;7、第三创建模块;8、第二放入模块;9、监听模块;10、关闭模块;11、删除模块;
31、预设单元;32、接受单元;33、第一分发单元;34、第二分发单元;35、清空单元;36、继续执行单元。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图详予说明。
本发明最关键的构思在于:设置多个查询线程,提高连接套接字的查询效率。
请参阅图1,一种基于多查询线程的通信方法,包括:
创建一个监听套接字,并将其与服务器的IP地址以及所述服务器的一个可用端口绑定;
创建两个以上的查询线程、两个以上的数据处理线程和一个接受连接线程;
接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程;
各查询线程接收所述连接套接字,并存入各自的查询套接字队列;
依据一查询线程可处理的最大连接套接字数量,各查询线程从各自的查询套接字队列中依序循环取出一组连接套接字;
接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理。
从上述描述可知,本发明的有益效果在于:可提升对连接套接字的查询速度,从而提升服务器的性能。
进一步地,所述“接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理”之后,进一步包括:
创建两个以上的数据发送线程;
将处理完且需要发送至客户端的数据放入发送队列,由所述数据发送线程发送至对应的客户端。
由上述描述可知,通过数据发送线程进行数据发送,实现服务器端与客户端之间的数据传输。
进一步地,所述“创建一个监听套接字,并将其与服务器的IP地址以及所述服务器的一个可用端口绑定”之后,进一步包括:
服务器通过所述监听套接字监听客户端的连接。
进一步地,所述“接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程”具体为:
预设时间片的时长;
接受连接线程通过监听套接字接受一时间片内客户端的连接,返回与各客户端一一对应的连接套接字,并存入接受套接字队列;
将所述接受套接字队列内的连接套接字分发给当前连接套接字个数最少的一查询线程;
若存在两个以上的所述一查询线程,则将所述接受套接字队列内的连接套接字分发给任一的所述一查询线程;
清空所述接受套接字队列;
继续执行所述接受连接线程通过监听套接字接受一时间片内客户端的连接的步骤。
由上述描述可知,通过负载均衡的分配方法,达到均衡各查询线程的压力的作用。
进一步地,所述“接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程;各查询线程接收所述连接套接字,并存入各自的查询套接字队列”之后,进一步包括:
若一客户端断开与服务器的连接,则关闭所述一客户端对应的连接套接字;
从接收所述连接套接字的查询线程的查询套接字队列中删除所述连接套接字,并通知数据处理线程进行回收处理。
由上述描述可知,通过对异常的连接套接字进行处理,可保证服务器的性能。
进一步地,所述查询线程、数据处理线程和数据发送线程的个数的比例为1:1:1。
由上述描述可知,通过设置相同个数的查询线程、数据处理线程和数据发送线程,可避免线程资源的浪费。
请参照图5,本发明还提出一种基于多查询线程的通信系统,包括:
第一创建模块,用于创建一个监听套接字,并将其与服务器的IP地址以及所述服务器的一个可用端口绑定;
第二创建模块,用于创建两个以上的查询线程、两个以上的数据处理线程和一个接受连接线程;
分发模块,用于接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程;
存入模块,用于各查询线程接收所述连接套接字,并存入各自的查询套接字队列;
取出模块,用于依据一查询线程可处理的最大连接套接字数量,各查询线程从各自的查询套接字队列中依序循环取出一组连接套接字;
第一放入模块,用于接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理。
进一步地,还包括:
第三创建模块,用于创建两个以上的数据发送线程;
第二放入模块,用于将处理完且需要发送至客户端的数据放入发送队列,由所述数据发送线程发送至对应的客户端。
进一步地,还包括:
监听模块,用于服务器通过所述监听套接字监听客户端的连接。
进一步地,所述分发模块包括:
预设单元,用于预设时间片的时长;
接受单元,用于接受连接线程通过监听套接字接受一时间片内客户端的连接,返回与各客户端一一对应的连接套接字,并存入接受套接字队列;
第一分发单元,用于将所述接受套接字队列内的连接套接字分发给当前连接套接字个数最少的一查询线程;
第二分发单元,用于若存在两个以上的所述一查询线程,则将所述接受套接字队列内的连接套接字分发给任一的所述一查询线程;
清空单元,用于清空所述接受套接字队列;
继续执行单元,用于继续执行所述接受连接线程通过监听套接字接受一时间片内客户端的连接的步骤。
进一步地,还包括:
关闭模块,用于若一客户端断开与服务器的连接,则关闭所述一客户端对应的连接套接字;
删除模块,用于从接收所述连接套接字的查询线程的查询套接字队列中删除所述连接套接字,并通知数据处理线程进行回收处理。
进一步地,所述查询线程、数据处理线程和数据发送线程的个数的比例为1:1:1。
实施例一
请参照图2,本发明的实施例一为:一种基于多查询线程的通信方法,包括如下步骤:
S1:创建一个监听套接字,并将其与服务器的IP地址(如0.0.0.0)以及所述服务器的一个可用端口绑定(如80端口);绑定之后,服务器通过所述监听套接字监听客户端的连接。
S2:创建两个以上的查询线程、两个以上的数据处理线程、一个接受连接线程和两个以上的数据发送线程;其中,查询线程、数据处理线程和数据发送线程的具体个数依据数据吞吐能力决定;优选地,所述查询线程、数据处理线程和数据发送线程的个数的比例为1:1:1,可避免线程资源的浪费。
S3:接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程。
S4:各查询线程接收所述连接套接字,并存入各自的查询套接字队列。
S5:依据一查询线程可处理的最大连接套接字数量,各查询线程从各自的查询套接字队列中依序循环取出一组连接套接字,然后对取出的一组连接套接字中的各个连接套接字进行查询,查询其是否有数据,具体地,可调用查询函数,判断这些连接套接字中是否有可读的数据。一个查询线程可处理的最大连接套接字数量为64个,那么一组连接套接字的个数尽可能地为64个;优选地,一次循环取出的各组连接套接字中,除最后一组外,其余组的连接套接字个数均为64个,若剩余连接套接字个数不足64个,则最后一组连接套接字的个数可小于64个。
查询线程对查询套接字队列中连接套接字的查询是一个循环过程,当查询套接字队列中的所有连接套接字都查询过一遍,又重新开始查询,直到程序退出。可保证所有的连接套接字不会被漏掉查询,也保证所有的连接套接字都只会在某一个查询线程中被查询,使得各查询线程的查询套接字队列中的连接套接字对象是唯一独立的,多线程互相的资源不存在共享访问,无需加锁操作,提升了多线程查询的并发处理速度。
S6:接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理。
S7:将处理完且需要发送至客户端的数据放入发送队列,由所述数据发送线程发送至对应的客户端。
由于在现有的使用场景中,查询线程的并发处理要求的响应优先级是要比接受连接线程的响应要高,高并发的核心能力是提高同时处理通信数据的能力,而接受并建立连接这个操作对于一个客户端的连接只需要执行一次,且并发量并不会太高,一旦用户连接上来以后,所有的压力都转移到了查询线程,这个时候考验的是查询线程的并发处理能力。所以本实施例采用一个接受连接线程和多个查询线程,其中,查询线程的个数,实际情况可根据CPU核心个数来决定,如果服务器有16核CPU,则可以创建16~32个查询线程。根据优化测试实验结果表明查询线程的个数为CPU核心个数的1~2倍比较合适,当然和服务器机器整体性能也有关系,所以最佳查询线程的数量是CPU核心数量的1~2倍。
本实施例利用多查询线程的机制来扩展select的能力,原来一个查询线程可以处理64个连接套接字,则n个查询线程则可以同时处理64*n个连接套接字的并发数据,提高了套接字查询的效率,从而提高了消息处理的速度;只设置一个接受连接线程来负责接受客户端的连接和连接套接字的分发,相比设置多个接受连接线程来说,减少了切换线程所消耗的时间,提高了连接处理效率;且套接字分发和套接字查询由不同的线程进行处理,节约了线程的性能。
实施例二
请参照图3,本实施例是实施例一中步骤S3的进一步拓展,具体包括如下步骤:
S31:预设时间片的时长。
S32:接受连接线程通过监听套接字接受一时间片内客户端的连接,返回与各客户端一一对应的连接套接字,并存入接受套接字队列。
S33:将所述接受套接字队列内的连接套接字分发给当前连接套接字个数最少的一查询线程。
S34:判断是否存在两个以上的所述一查询线程,若是,执行步骤S35,若否,则直接分发给当前连接套接字个数最少的查询线程。
S35:将所述接受套接字队列内的连接套接字分发给任一的所述一查询线程。
S36:清空所述接受套接字队列;然后接受连接线程继续通过监听套接字接受下一时间片内客户端的连接,即执行步骤S32。
例如,假设创建了三个查询线程a、b、c,在第一个时间片内,接受连接线程接受了10个客户端的连接,此时接受套接字队列中有10个连接套接字,由于此时三个查询线程都没有连接套接字,因此分发给任意一个查询线程,假设分发给查询线程a,则a的查询套接字队列中有10个连接套接字,然后清空接受套接字队列中的连接套接字,接受连接线程继续接受下一时间片内客户端的连接;以此类推,假设在第二个时间片内接受了5个客户端的连接,并将5个连接套接字分发给了查询线程b,第三个时间片内接受了15个客户端的连接,并将15个连接套接字分发给了查询线程c;此时,查询线程b的查询套接字队列中的连接套接字的个数最少,因此,第四个时间片内返回的连接套接字均分发给查询线程b,然后再确定出新的连接套接字个数最少的查新线程,再将第五个时间片内返回的连接套接字分发给它,以此类推。
通过负载均衡的分配方法,达到均衡各查询线程的压力的作用。
实施例三
请参照图4,本实施例是上述实施例的进一步拓展,相同之处不再累述,区别在于,步骤S3之后还包括如下步骤:
S8:判断是否有客户端断开与服务器的连接,若是,执行步骤S9。
S9:关闭断开连接的客户端对应的连接套接字。
S10:从接收所述连接套接字的查询线程的查询套接字队列中删除所述连接套接字,并通知数据处理线程进行回收处理。
本实施例通过该对异常的连接套接字进行处理,进一步保证服务器的性能。
实施例四
请参照图6,本实施例是对应上述实施例的一种基于多查询线程的通信系统,包括:
第一创建模块1,用于创建一个监听套接字,并将其与服务器的IP地址以及所述服务器的一个可用端口绑定;
第二创建模块2,用于创建两个以上的查询线程、两个以上的数据处理线程和一个接受连接线程;
分发模块3,用于接受连接线程通过监听套接字接受客户端的连接,返回与各客户端一一对应的连接套接字,并将连接套接字分发给各查询线程;
存入模块4,用于各查询线程接收所述连接套接字,并存入各自的查询套接字队列;
取出模块5,用于依据一查询线程可处理的最大连接套接字数量,各查询线程从各自的查询套接字队列中依序循环取出一组连接套接字;
第一放入模块6,用于接收所述一组连接套接字中有数据的连接套接字中的数据,并将所述数据放入数据队列,由所述数据处理线程并发处理。
进一步地,还包括:
第三创建模块7,用于创建两个以上的数据发送线程;
第二放入模块8,用于将处理完且需要发送至客户端的数据放入发送队列,由所述数据发送线程发送至对应的客户端。
进一步地,还包括:
监听模块9,用于服务器通过所述监听套接字监听客户端的连接。
进一步地,所述分发模块3包括:
预设单元31,用于预设时间片的时长;
接受单元32,用于接受连接线程通过监听套接字接受一时间片内客户端的连接,返回与各客户端一一对应的连接套接字,并存入接受套接字队列;
第一分发单元33,用于将所述接受套接字队列内的连接套接字分发给当前连接套接字个数最少的一查询线程;
第二分发单元34,用于若存在两个以上的所述一查询线程,则将所述接受套接字队列内的连接套接字分发给任一的所述一查询线程;
清空单元35,用于清空所述接受套接字队列;
继续执行单元36,用于继续执行所述接受连接线程通过监听套接字接受一时间片内客户端的连接的步骤。
进一步地,还包括:
关闭模块10,用于若一客户端断开与服务器的连接,则关闭所述一客户端对应的连接套接字;
删除模块11,用于从接收所述连接套接字的查询线程的查询套接字队列中删除所述连接套接字,并通知数据处理线程进行回收处理。
进一步地,所述查询线程、数据处理线程和数据发送线程的个数的比例为1:1:1。
综上所述,本发明提供的一种基于多查询线程的通信方法及其系统,利用多查询线程的机制来扩展select的能力,原来一个查询线程可以处理64个连接套接字,则n个查询线程则可以同时处理64*n个连接套接字的并发数据,提高了套接字查询的效率,从而提高了消息处理的速度;只设置一个接受连接线程来负责接受客户端的连接和连接套接字的分发,相比设置多个接受连接线程来说,减少了切换线程所消耗的时间,提高了连接处理效率;且套接字分发和套接字查询由不同的线程进行处理,节约了线程的性能;同时,通过接受连接线程将连接套接字分发至各查询线程,各查询线程循环查询自身查询套接字队列中的连接套接字,保证所有的连接套接字都能被查询,也保证所有的连接套接字都只会在某一个查询线程中被查询,查询线程的查询套接字队列中的套接字对象是唯一独立的,多线程互相的资源不存在共享访问,无需加锁操作,提升了多线程查询的并发处理速度。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。