一种基于socket的网络通信方法、装置及系统转让专利

申请号 : CN201110385444.8

文献号 : CN103139157B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 吴晶晶唐斌朱亨国

申请人 : 北京南车时代信息技术有限公司

摘要 :

本发明提供的基于socket的网络通信方法中,服务端发送数据时,根据客户端的主机名寻找对应的socket类对象和socket通信队列,将客户端的线程名和待发送数据写入socket通信队列;从socket通信队列中提取出待发送数据并发送;客户端的socket接收到服务端发送的数据,进行解析,根据解析出的线程名找到相应的线程队列,并将去除线程名后的原始数据写入线程队列中;从线程队列中提取出服务端发送的数据。本发明提供的网络通信方法及系统,使得应用程序设计者在进行应用程序开发时,不需要考虑底层socket网络通信编程,只需调用网络接口函数即可,整个网络通信过程简洁明了。

权利要求 :

1.一种基于socket的网络通信方法,其特征在于,该方法包括:

A:初始化过程,包括:

A1:确定与服务端具有连接关系的客户端,分别创建与每一个客户端对应的socket类对象,并记录所述客户端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的客户端主机的主机名,将所述socket类对象指针存入预先建立的服务端socket链表中;

A2:分别建立与所述服务端socket链表中每一个socket类对象对应的socket通信队列,并记录所述socket类对象与其对应的socket通信队列的对应关系;

B:通信过程,包括:

B1:服务端监听网络状态,当监听到客户端发送的连接请求,接收来自发送连接请求的客户端的连接;

B2:服务端指定待接收数据客户端的主机名、线程名和待发送的数据,根据所述主机名确定待接收数据客户端对应的socket类对象,并确定与所述socket类对象对应的socket通信队列;

B3:将所述线程名和所述待发送数据写入待接收数据的客户端对应的socket通信队列中;

B4:与所述socket类对象对应的socket执行程序提取所述socket通信队列中的线程名和待发送数据,并发送给待接收数据的客户端;

B5:所述待接收数据的客户端接收服务端发送的数据,从所述服务端发送的数据中解析出线程名,将所述数据中去除线程名后的数据存入预先建立的所述解析出的线程名所对应的线程队列中,客户端的指定线程从所述线程队列中提取数据。

2.根据权利要求1所述的方法,其特征在于,所述服务端接收来自发送连接请求的客户端的连接具体为:判断所述发送请求的客户端对应的socket类对象是否存在于所述服务端socket链表中时,如果是,则接收来自发送连接请求的客户端的连接;如果否,则创建socket类对象并进行绑定监听,然后接收来自发送连接请求的客户端的连接。

3.一种基于socket的网络通信方法,其特征在于,该方法包括:

C:初始化过程,包括:

C1:确定与客户端具有连接关系的服务端,分别创建与每一个服务端对应的socket类对象,并记录所述服务端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的服务端的主机信息,将所述socket类对象指针存入预先建立的客户端socket链表;

C2:客户端创建线程队列链表,然后注册线程队列,将线程队列和线程名绑定;

D:通信过程,包括:

D1:向与所述客户端socket链表中的socket类对象对应的服务端发送连接请求,当客户端发送的连接请求被所述服务端监听到,客户端与监听到所述连接请求的服务端建立连接;

D2:与客户端建立连接的服务端指定待接收数据客户端的主机名、线程名和待发送的数据,将线程名和待发送的数据存入服务端socket链表中与客户端对应的socket类对象所对应的通信队列中,与所述socket类对象对应的socket执行程序提取所述socket通信队列中的线程名和待发送数据,并发送给客户端;

D3:客户端接收与其建立连接的服务端发送的数据,从接收的数据中解析出线程名;

D4:将所述线程名从所述接收的数据中去除;

D5:将去除线程名后的数据写入所述解析出的线程名所对应的线程队列中;

D6:从线程队列中提取所述去除线程名后的数据。

4.根据权利要求3所述的方法,其特征在于,所述线程队列链表中的存放单元为含有线程队列句柄和线程名的结构体,注册线程队列时,将所述线程队列句柄和线程名写入结构体,将结构体添加至线程队列链表尾部。

5.一种基于socket的服务端网络通信装置,其特征在于,包括:

第一初始化模块,用于确定与服务端具有连接关系的客户端,分别创建与每一个客户端对应的socket类对象,并记录所述客户端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的客户端主机的主机名,将所述socket类对象指针存入预先建立的服务端socket链表;分别建立与所述服务端socket链表中每一个socket类对象对应的socket通信队列,并记录所述socket类对象与其对应的socket通信队列的对应关系;

监听模块,用于监听客户端发送的连接请求,接收来自客户端的连接;

发送模块,用于确定与所述发送请求客户端对应的socket类对象,并确定与所述socket类对象对应的socket通信队列;将服务端所指定的线程名和待发送数据写入与待接收数据的客户端对应的socket通信队列中;与所述socket类对象对应的socket执行程序提取所述socket通信队列中的线程名和待发送数据,并发送给待接收数据的客户端。

6.一种基于socket的客户端网络通信装置,其特征在于,包括:

第二初始化模块,用于确定与客户端具有连接关系的服务端,分别创建与每一个服务端对应的socket类对象,并记录所述服务端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的服务端的主机信息,将所述socket类对象指针存入预先建立的客户端socket链表;还用于创建线程队列,然后注册线程队列,将线程队列和线程名绑定;

连接模块,用于加载套接字库,创建客户端socket,向与所述客户端socket链表中的socket类对象对应的服务端发出连接请求直至连接成功;

接收模块,用于接收服务端发送的数据,并对数据进行解析,解析出线程名,将去除线程名后的数据写入所述解析出的线程名所对应的线程队列中,读取所述线程队列的数据。

7.一种基于socket的网络通信系统,其特征在于,包括如权利要求5和权利要求6所述的网络通信装置。

说明书 :

一种基于socket的网络通信方法、装置及系统

技术领域

[0001] 本发明涉及网络通信技术领域,尤其涉及一种基于socket的网络通信方法、装置及系统。

背景技术

[0002] 在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。套接字,是支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的双方的一种约定,用套接字中的相关函数来完成通信过程。
[0003] 在利用套接字通信时要先建立套接字的连接,根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、客户端请求、连接确认。服务器监听是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,按时监控网络状态;客户端请求是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。连接确认是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
[0004] 例如,应用程序a、b、c、d等分别为运行在同一网络上的不同结点的计算机中,若应用程序a希望发送数据到应用程序b中,而应用程序b希望自己的b-1线程接收并处理该数据,假设a为服务端,b为客户端,其实现方式如下:在a的某处建立服务端socket,在b的b-1线程处建立客户端socket并连接;a程序调用socket发送函数,发送数据至b程序的b-1线程中的socket;b-1线程调用socket接收函数读取数据,应用程序b对接收数据进行处理。
[0005] 由上述应用程序a与b的通信过程可得知,运行在网络上的两个不同结点的多线程应用程序,若想建立稳定的socket连接并收发数据,且发送方希望接收方的指定线程接收数据,一般情况下,需要在发送方和接收方的指定线程编写socket通信代码。因此,在进行应用程序的设计时,应用程序的设计者需要关心socket程序设计的细节,包括调用socket函数来建立连接、读取、发送、查询网络消息以及维护socket通信网络等,整个网络通信过程较为复杂。

发明内容

[0006] 有鉴于此,本发明提供了一种基于socket的网络通信方法、装置及系统,用于解决应用程序的设计者需要考虑socket程序设计细节、整个网络通信过程复杂的问题。
[0007] 一种基于socket的网络通信方法,该方法包括:
[0008] A:初始化过程,包括:
[0009] A1:确定与服务端具有连接关系的客户端,分别创建与每一个客户端对应的socket类对象,并记录所述客户端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的客户端主机的主机名,将所述socket类对象指针存入预先建立的服务端socket链表;
[0010] A2:分别建立与所述服务端socket链表中每一个socket类对象对应的socket通信队列,并记录所述socket类对象与其对应的socket通信队列的对应关系;
[0011] B:通信过程,包括:
[0012] B1:服务端监听网络状态,当监听到客户端发送的连接请求,接收来自发送连接请求的客户端的连接;
[0013] B2:服务端指定待接收数据客户端的主机名、线程名和待发送的数据,服务端根据主机名确定带发送数据客户端对应的socket类对象,并确定与所述socket类对象对应的socket通信队列;
[0014] B3:将所述线程名和待发送数据写入与待接收数据的客户端对应的socket通信队列中;
[0015] B4:与所述socket类对象对应的socket执行程序提取所述socket通信队列中的线程名和待发送数据,并发送给待接收数据的客户端;
[0016] B5:所述待接收数据的客户端接收所述服务端发送的数据,从所述数据中解析出线程名,将所述数据中去除线程名后的数据存入预先建立的所述解析出的线程名所对应的线程队列中,客户端的指定线程从所述线程队列中提取数据。
[0017] 所述服务端接收来自发送连接请求的客户端的连接具体为:
[0018] 判断所述发送请求的客户端对应的socket类对象是否存在于所述服务端socket链表中时,如果是,则接收来自发送连接请求的客户端的连接;如果否,则创建socket类对象并进行绑定监听,然后接收来自发送连接请求的客户端的连接。
[0019] 一种基于socket的网络通信方法,该方法包括:
[0020] C:初始化过程,包括:
[0021] C1:确定与客户端具有连接关系的服务端,分别创建与每一个服务端对应的socket类对象,并记录所述服务端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的服务端的主机信息,将所述socket类对象指针存入预先建立的客户端socket链表;
[0022] C2:客户端创建线程队列链表,然后注册线程队列,将线程队列和线程名绑定;
[0023] D:通信过程,包括:
[0024] D1:向与所述客户端socket链表中的socket类对象对应的服务端发送连接请求,当客户端发送的连接请求被所述服务端监听到,客户端与监听到所述连接请求的服务端建立连接;
[0025] D2:服务端指定待接收数据客户端的主机名、线程名和待发送的数据,与客户端建立连接的服务端将线程名和待发送数据存入服务端socket链表中与客户端对应的socket类对象所对应的通信队列中,与所述socket类对象对应的socket执行程序提取所述socket通信队列中的线程名和待发送数据,并发送给所述客户端;
[0026] D3:客户端接收与其建立连接的服务端发送的数据,从接收的数据中解析出线程名;
[0027] D4:将所述线程名从所述接收的数据中去除;
[0028] D5:将去除线程名后的数据写入所述解析出的线程名所对应的线程队列中;
[0029] D6:从线程队列中提取所述去除线程名后的数据。
[0030] 所述线程队列链表中的存放单元为含有线程队列句柄和线程名的结构体,注册线程队列时,将所述线程队列句柄和线程名写入结构体,将结构体添加至线程队列链表尾部。
[0031] 一种基于socket的服务端网络通信装置,包括:
[0032] 第一初始化模块,用于确定与服务端具有连接关系的客户端,分别创建与每一个客户端对应的socket类对象,并记录所述客户端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的客户端主机的主机名,将所述socket类对象指针存入预先建立的服务端socket链表;分别建立与所述服务端socket链表中每一个socket类对象对应的socket通信队列,并记录所述socket类对象与其对应的socket通信队列的对应关系;
[0033] 监听模块,用于监听客户端发送的连接请求,接收来自客户端的连接;
[0034] 发送模块,用于确定与所述发送请求客户端对应的socket类对象,并确定与所述socket类对象对应的socket通信队列;将服务端指定的线程名和待发送数据写入与待接收数据的客户端对应的socket通信队列中;与所述socket类对象对应的socket执行程序提取所述socket通信队列中的线程名和待发送数据,并发送给所述发送请求的客户端。
[0035] 一种基于socket的客户端网络通信装置,包括:
[0036] 第二初始化模块,用于确定与客户端具有连接关系的服务端,分别创建与每一个服务端对应的socket类对象,并记录所述服务端与其对应的socket类对象的对应关系,所述socket类对象中包含了与其对应的服务端主机的主机名,将所述socket类对象指针存入预先建立的客户端socket链表;还用于创建线程队列,然后注册线程队列,将线程队列和线程名绑定;
[0037] 连接模块,用于加载套接字库,创建客户端socket,向与所述客户端socket链表中的socket类对象对应的服务端发出连接请求直至连接成功;
[0038] 接收模块,用于接收服务端发送的数据,并对数据进行解析,解析出线程名,将去除线程名后的数据写入所述解析出的线程名所对应的线程队列中,读取所述线程队列的数据。
[0039] 一种基于socket的网络通信系统,包括上述客户端网络通信装置和服务端的网络通信装置。
[0040] 本发明提供的基于socket的网络通信方法及系统中,当服务端发送数据时,根据客户端的主机名寻找对应的socket类对象和socket通信队列,将客户端的线程名和待发送数据写入socket通信队列;从socket通信队列中提取出待发送数据并发送;客户端的socket接收到服务端发送的数据,进行解析,根据解析出的线程名得到相应的线程队列,并将去除线程名后的原始数据写入线程队列中;从线程队列中提取出客户端发送的数据。本发明提供的网络通信方法及系统,使得应用程序设计者在进行应用程序开发时,不需要考虑socket程序设计细节,整个网络通信过程简洁明了。

附图说明

[0041] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0042] 图1为本发明实施例提供的网络通信方法的时序图。

具体实施方式

[0043] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0044] 实施例一
[0045] 本发明实施例提供了一种基于socket的网络通信方法,该方法的时序图如图1所示,包括:初始化过程和通信过程,对于服务端而言,初始化过程包括:
[0046] S11:确定与服务端具有连接关系的客户端,分别创建与每一个客户端对应的socket类对象,并记录客户端与其对应的socket类对象的对应关系;
[0047] 其中,socket类对象中包含了与其对应的客户端的主机信息,包括客户端主机的主机名、IP地址。
[0048] S12:将socket类对象指针存入预先建立的服务端socket链表;
[0049] 在本实施例中,将socket类对象指针存入服务端socket链表中,socket类对象指针指向socket类对象,当然,也可将socket类对象直接存入服务端socket链表中。
[0050] S13:分别建立与服务端socket链表中每一个socket类对象对应的socket通信队列,并记录所述socket类对象与其对应的socket通信队列的对应关系;
[0051] 在本实施例中,建立通信队列的同时,为通信队列标识,以方便查找。
[0052] 通信过程包括:
[0053] 服务端监听网络状态,当监听到客户端发送的连接请求,接收来自发送连接请求的客户端的连接;
[0054] 其中,服务端接收来自发送连接请求的客户端的连接之前,首先判断发送连接请求的客户端对应的socket类对象是否存在于服务端socket链表中,如果是,则接收来自发送连接请求的客户端的连接;如果否,则创建socket类对象,然后接收来自发送连接请求的客户端的连接。
[0055] 服务端向客户端发送数据的过程为:
[0056] S21:服务端指定待接收数据客户端的主机名、线程名和待发送的数据,服务端根据主机名确定待接收数据的客户端对应的socket类对象,并确定与所述socket类对象对应的socket通信队列;
[0057] 在本实施例中,客户端的主机名、线程名和待发送数据由服务端的应用层指定,对于服务端而言,接收服务端发送的数据的客户端是已知的。
[0058] S22:将线程名和待发送数据写入待接收数据的客户端对应的socket通信队列中;
[0059] S23:与socket类对象对应的socket执行程序提取socket通信队列中的线程名和待发送数据,并发送给待接收数据的客户端;
[0060] 对于客户端而言,接收服务端发送的数据的过程包括初始化过程和通信过程,其中,初始化过程包括:
[0061] S31:确定与客户端具有连接关系的服务端,分别创建与每一个服务端对应的socket类对象,并记录服务端与其对应的socket类对象的对应关系,socket类对象中包含了与其对应的服务端的主机信息;
[0062] 其中,socket类对象中包含了与其对应的服务端主机的主机名、IP地址和端口号。
[0063] S32:将socket类对象指针存入预先建立的客户端socket链表;
[0064] S33:创建线程队列链表,然后注册线程队列,将线程队列和线程名绑定。
[0065] 通信过程包括:
[0066] 客户端加载套接字库,创建客户端socket,向与客户端socket链表中的socket类对象对应的服务端发送连接请求,当客户端发送的连接请求被服务端监听到,客户端与监听到连接请求的服务端建立连接;与客户端建立连接的服务端将线程名和待发送数据写入通信队列中,该通信队列为与服务端socket中与客户端对应的socket类对象所对应的通信队列,与socket类对象对应的socket执行程序提取socket通信队列中的线程名和待发送数据,并发送给客户端;
[0067] 客户端接收发送端发送的数据的过程为:
[0068] S41:客户端接收服务端发送的数据,从接收的数据中解析出线程名;
[0069] S42:将线程名从接收的数据中去除;
[0070] S43:将接收数据中去除线程名后的数据写入所述解析出的线程名所对应的线程队列中;
[0071] 其中,接收数据中去除线程名后的数据即为服务端发送的原始数据。
[0072] S44:客户端的指定线程从线程队列中提取出服务端发送的原始数据。
[0073] 其中,注册线程队列,将线程队列和线程名绑定的过程如下:创建一个线程队列链表,存放的单元为含有线程队列句柄和线程名的结构体,注册线程队列时,将线程队列句柄和线程名写入结构体中,再将此结构体添加至线程队列链表尾部。
[0074] 本发明实施例提供的网络通信方法实现的是网络底层的socket通信,服务端发送数据时,只需在应用层指定接收数据的客户端的主机名、线程名和待发送数据即可。
[0075] 实施例二
[0076] 本发明实施例提供了一种基于socket的网络通信系统,包括服务端的网络通信装置和客户端的网络通信装置,其中服务端的网络通信装置包括:第一初始化模块、监听模块和发送模块。
[0077] 第一初始化模块,用于确定与服务端具有连接关系的客户端,分别创建与每一个客户端对应的socket类对象,并记录客户端与其对应的socket类对象的对应关系,socket类对象中包含了与其对应的客户端主机的主机名,将socket类对象指针存入预先建立的服务端socket链表;分别建立与服务端socket链表中每一个socket类对象对应的socket通信队列,并记录socket类对象与其对应的socket通信队列的对应关系。
[0078] 监听模块,用于监听客户端发送的连接请求,接收来自客户端的连接。
[0079] 发送模块,用于确定与待接收数据的客户端对应的socket类对象,并确定与socket类对象对应的socket通信队列;将服务端指定的线程名和待发送数据写入与待接收数据的客户端对应的socket通信队列中;与socket类对象对应的socket执行程序提取socket通信队列中的线程名和待发送数据,并发送给待接收数据的客户端。
[0080] 其中,服务端的应用层指定接收数据客户端的主机名、线程名和待发送数据,根据指定的主机名查找该主机名对应的socket类对象,在根据找出的socket类对象查找对应的socket通信队列,然后将线程名和待发送数据写入找出的socket通信队列中。
[0081] 客户端的网络通信装置包括:第二初始化模块、连接模块和接收模块。
[0082] 第二初始化模块,用于确定与客户端具有连接关系的服务端,分别创建与每一个服务端对应的socket类对象,并记录服务端与其对应的socket类对象的对应关系,socket类对象中包含了与其对应的服务端主机的主机名,将socket类对象指针存入预先建立的客户端socket链表;还用于创建线程队列,然后注册线程队列,将线程队列和线程名绑定。
[0083] 连接模块,用于加载套接字库,创建客户端socket,向与客户端socket链表中的socket类对象对应的服务端发出连接请求直至连接成功。
[0084] 接收模块,用于接收服务端发送的数据,并对数据进行解析,解析出线程名,将去除线程名后的数据写入所述解析出的线程名所对应的线程队列中,读取所述线程队列的数据。
[0085] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。