卢 照 何志林
(运城学院计算机科学与技术系 运城 044000)
基于TCP的多线程通信在阴极保护软件中的应用*
卢照何志林
(运城学院计算机科学与技术系运城044000)
摘要通信服务软件是阴极保护无线终端监控系统的重要组成部分,通信的实时性和准确性直接影响到整个阴保软件的性能和决策。系统运用.NET框架中的Socket类进行开发,Winsock32 API提供了套接字服务,为实现网络编程提供了大量的方法。软件利用多线程技术,采用了TCP协议的套接字通信,应用于实际阴极保护软件系统中,实现了终端设备与服务器之间的实时通信,为阴保软件提供了实时的数据信息,起到了对终端设备状态实时的监测作用。系统在实际应用中稳定性和实时性都比较令人满意。
关键词网络通信; 多线程; Socket; TCP
Class NumberTP393.1
阴极保护技术是电化学保护技术的一种,其原理是向被腐蚀金属结构物表面施加一个外加电流,被保护结构物成为阴极,从而使得金属腐蚀发生的电子迁移得到抑制,避免或减弱腐蚀的发生[1]。
阴极保护无线终端监控系统就是通过计算机网络技术对设备的状态数据进行实时监测,主要有两种类型,一种是生产现场没有监控系统,而是将数据采集之后直接送至远程计算机进行处理,这种远程测控和通常的现场测控没有太大的区分,只是数据传输比现场测控系统距离要遥远;另一种是现场监控和远程监控并存。本文主要研究如何采用多线程技术解决大量外围设备数据通过计算机网络发送给远程服务器。
套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元[2]。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字有两种不同的类型:流套接字和数据报套接字[3]。要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户机端,另一个运行于服务器端。
TCP/IP是Internet上广泛使用的一种数据通信协议,可用于不同机器之间的互联。在网络编程中,编程人员不需要掌握TCP/IP的具体实现细节,只需利用协议的网络编程接口套接字即可[4]。在Windows中,网络编程接口是Windows Socket它包含了标准的Berkley Sockets的功能调用的集合。TCP/IP协议的应用一般采用客户/服务器模式,面向连接的应用调用如图1所示[5]。
图1 服务端和客户端套接字对应调用关系
3.1通信基础协议选择
在网络通信协议选择上,采用Windows Socket实现了常用的Socket通信应用类型有两种[6]:一种是面向连接的传输控制协议(Transmission Control Protocol,TCP)服务应用,第二种是用于无连接的用户数据报协议(User Data Protocol,UDP)服务应用。对于TCP通信来说,在发送和接收数据之前先要与对方建立连接,是一种可靠性较高的传输协议。采用UDP协议在发生和接收数据前不需要建立连接,可以将数据先发送到网络上,再根据报文信息找到目标机器,实时性要高于TCP传输,但准确性不如TCP传输,可能会丢失数据包[7~8]。
从文章研究内容出发,是为了将终端设备的状态数据信息发送到服务器端,然后根据状态数据决定设备的性能和工作如何。因此,对数据的实时性要求不高,但对数据的准确性要求较高。因此,软件采用了基于TCP协议进行Socket通信。
3.2工作流程
在阴极保护无线终端监控系统中,各个检测的管道设备都分散在野外各个地点,通过Internet网络将数据发送到通信服务器上,服务器端接收数据并根据接收的信息进行必要的应答,然后将这些数据信息进行备份后转发给应用服务器,应用服务器将接收的数据进行解析后存放到各个表中,提供给客户的应用软件查询使用。图2为基本的数据发送结构图。
图2 终端设备发送结构图
4.1通信线程的建立和初始化
当启动服务器端以后,服务器端就一直处于监听状态,等待客户端连接,当有终端设备连接服务器时,建立一个新的线程进行数据传输。
Listener = New TcpListener(localAddr, Port)
Listener.Start()
Listener.BeginAcceptTcpClient(AddressOfHandleAsyncConnection, Listener)
……
‘建立连接对象
Dim sessionComm As SessionCommunications = New SessionCommunications(client, conID)
SessionCollection.Insert(0, sessionComm)
Dim new Session As New Thread(AddressOf Run)
newSession.IsBackground = True
newSession.Start(SessionCollection.Item(0))‘开始运行新建线程Run代码
图3所示是整个通信程序的结构流程,当有多个设备同时连接时,服务器端会建立连接各自的连接对象,并插入到列表中,同时分别开辟多个对应的线程为每个连接对象服务,从而保证数据通信之间的独立性和完整性[9]。
图3 整体程序流程图
4.2通信线程的核心操作
在通信线程的共有操作Run函数中,首先给各个线程分配必要的通信缓存空间,然后根据参数获取线程的标识,建立线程通信的客户端资源信息,如通过连接对象获取客户端Socket流,通过流可以进行Socket的读写操作[10]。
Server = ConnsessionObj.theClient
Stream = Server.GetStream()
当设置好线程初始状态后,服务器端的连接线程开始进入循环工作状态,在循环工作状态中通过Stream.DataAvailable()方法判断流中是否有数据可读,如果暂时无数据可读,通过设置Havedata标记为0,同时延时一定时间,可以让出CPU给其他线程工作,若是有可读数据,Havedata设置为1,可以通过函数Stream.Read()方法获取客户端发送的数据。如此反复循环进行判断操作。服务器定期需要给客户端发送01字符,判断客户是否还在线,如果客户端已经断开连接,则服务器端需要的操作是从连接对象列表中删除该连接对象,同时释放连接资源,操作如下:
ForiAsInteger = 0 ToSessionCollection.Count-1
IfCType(SessionCollection(i), SessionCommunications).theClientIssession.theClientThen
SessionCollection.RemoveAt(i)
Exit For
EndIf
Next
session.Close()
session.theClient = Nothing
GC.GetTotalMemory(True)
图4为线程操作的具体流程图。
图4 线程执行流程图
核心代码如下:
IfHavedata = 0 Then
weHaveThePuck = True
IfStream.DataAvailable() Then
Havedata = 1
Else
’线程停留
Thread.Sleep(100)
EndIf
Else
DimreadlenAsInteger
Try
readlen = Stream.Read(strStream, 0, strStream.Length)
Catch ex AsException
session.Close()
session.theClient = Nothing
GC.Collect()
GC.GetTotalMemory(True)
’GC.WaitForPendingFinalizers()
Exit Do
EndTry
DimstrAsString = System.Text.Encoding.ASCII.GetString(strStream, 0, readlen).Trim()
packetSize = str.Length
theBuffer = System.Text.Encoding.ASCII.GetBytes(str.Substring(0, packetSize))
IpEndPoint = CType(Server.Client.RemoteEndPoint, Net.IPEndPoint) '获取远程IP和端口号
RcvBytes(theBuffer, session.sessionID, 1)
SendServer(theBuffer)
Havedata = 0
Stream.Flush()
EndIf
idleTimer = Now
EndIf
If Now >idleTimer.AddMilliseconds(300) Then
Thread.Sleep(200)
EndIf
Loop
通信服务软件接收数据运行界面如图5所示。
图5 运行界面
4.3通信数据处理机制
通信服务器接收到数据后,会根据通信协议,根据各个消息头内容,首先将数据信息存放到Oracle数据中,然后再对收到的数据进行解析,分别存放到相应的各个表中,供前台页面调用查询。需要说明的是当数据大量接收时,在程序中进行数据解析是不行的,造成CPU的使用率很高,这里通过在Oracle数据库的触发器中编写代码进行数据解析,对通信服务器的分析数据压力降低了很多。
在通信软件系统开发和调试过程中,遇到的一些关键性问题,现将问题进行归纳总结如下,为在同类软件开发中提供参考价值。
1) 连接对象重复问题解决
在阴极保护无线终端监控系统中,所有终端设备与服务器之间的连接是间歇性的,只有当有数据时才连接服务器并发送数据,发送数据的条数和发送时间的长度也是不固定的。终端发送结束后会自动断开连接,在这种情况下,服务器端并不知道客户端已经断开,在连接对象列表中还保存着该对象,当该终端第二次连接时会生成一个新的连接对象存放在列表中,如此反复,造成连接对象列表出现多个同一个设备的连接对象,通信服务软件的内存会不断上升,占用很大内存资源。针对以上问题,在服务器端监听到有终端设备请求连接时,首先从连接对象列表中进行遍历,将之前未释放的连接对象关闭释放掉,然后生成新的连接对象,插入到列表中,从而保证了列表中每个终端设备连接对象的唯一性。
2) 客户端连接断开问题解决
在阴极保护无线终端监控系统中,由于终端设备和服务器之间没有设置数据发送完成的握手信号,造成客户端已经断开了连接,服务器端不清楚是否断开,连接对象的资源得不到释放,占据的内存空间不断上升。这里的解决方法有两种:第一种是间隔固定的时间后,服务端断开客户端连接释放资源。第二种方法是服务器在很短的时间间隔内定期给客户端发送数据,如果客户端已经断开,此时会发生异常,通过捕捉异常信息进行判断客户端是否已经断开。两种方法需要根据具体的实际情况来决定采用哪种方法较好。
3) 线程CPU资源消耗问题解决
多线程执行函数中,采用了Do…Loop循环语句,线程中不断在判断终端是否有发送来的数据,在对线程运行环境下,CPU的消耗是很大的,因此,在循环中进行判断,如果没有数据发送过来,该线程进行适当的延时,将CPU交给其他线程使用,从而很大地提高了CPU的利用效率,在多线程之间进行更好的切换。
4) 多线程资源利用冲突问题解决
多线程通信中,对共享资源的访问是必不可少的,因此,使用好同步锁机制至关重要。例如在连接对象列表中通过下标对某个终端发送数据时,此时可能有新的终端连接对象不断插入到列表中,造成下标访问的元素并非此前的元素,发生混乱,因此需要通过同步锁机制,在操作某个连接对象时,将整个连接对象队列进行锁定,处理完成后再解锁,保证通信操作的正确性[11]。
5) 系统持续稳定检测问题解决
阴极保护无线终端监控系统要求长期稳定的工作,为了防止通信服务器死机或者人为关闭,开发了监测小程序,通过监测进程管理器和定时发送反馈消息监控通信服务器的运行状态,一旦发现异常,杀掉现有进程,重新启动新的通信服务程序。
在多线程TCP通信在阴保软件系统中得到了成功的应用,可以给同类型的应用提供很好的借鉴和帮助。同时,随着设备数量的不断增大,相应进程数量也会不断增大,造成内存和CPU资源的不断上升。因此可以考虑进行细粒度化的并发线程控制,可以让一个独立线程控制多个终端的数据通信;也可以采用线程队列,使用CPU轮流为通信服务,提高通信效率和并发效果。
参 考 文 献
[1] 薛致远,毕武喜,陈振华,等.油气管道阴极保护技术现状与展望[J].油气储运,2014,33(9):938-944.
XUE Zhiyuan, BI Wuxi, CHEN Zhenhua, et al. Situation and outlook for cathodic protectiontechnology of oil & gas pipeline[J]. Oil & Gas Storage and Transportation,2014,33(9):938-944.
[2] 沈明,蒲保兴,唐彬.基于Windows套接字编程的网络编码仿真实现[J].软件,2012,33(2):11-14.
SHEN Ming, PU Baoxing, TANG Bin. Simulation Implementation of Network Coding Based on Windows Socket Programming[J]. Software,2012,33(2):11-14.
[3] 张维承,王勇,陈抗生.原始套接字编程在嵌入式Internet通信协议中的应用[J].计算机应用研究,2002(10):29-30.
ZHANG Weicheng, WANG Yong, CHEN Kangsheng. The Application of Raw Socket Programmingin Embedded Internet Communication Protocol[J]. Application Research of Computers,2002(10):29-30.
[4] 高立江.即时通讯系统的设计与实现[D].成都:电子科技大学,2012:10-14.
GAO Lijiang. Design and implementation of real-time communication system[D]. Chengdu: University of Electronic Science and Technology of China,2012:10-14.
[5] 张华.基于Vxworks的TCP/IP网络通信设计在车载武器系统中的应用[J].计算机与数字工程,2012,40(8):152-154.
ZHANG Hua. TCP/IP NetWork Communication Dseign Based on Vxworks in Vehicle-mounted Weapon System[J]. Computer & Digital Engineering,2012,40(8):152-154.
[6] 孙晓梦,王志斌.基于TCP的多线程Socket通信实例[J].辽东学院学报(自然科学版),2013,20(3):178-182.
SUN Xiaomeng, WANG Zhibin. A TCP—Based Multithread Socket Communication System[J]. Liaodong University(Natural Science),2013(3):178-182.
[7] 董方秀,邓忠华.一种改进的TCP拥塞控制算法及仿真[J].计算机与数字工程,2012,40(11):77-78.
DONG Fangxiu, DENG Zhonghua. An Improved TCP Congestion Control Algorithm and Simulation[J]. Computer & Digital Engineering,2012,40(11):76-78.
[8] 陈小辉,刘心松,等.分布式并行数据库中基于调度的多线程通信模型之研究[J].小型微型计算机系统,2005,26(4):604-608.
CHEN Xiaohui, LIU Xinsong, et al. Study on Multithreaded-Communication-Model Based on Scheduling in Distributedand Parallel Data base System[J]. Journal of Chinese Computer Systems,2005,26(4):604-608.
[9] 罗亚非.基于TCP的Socket多线程通信[J].电脑知识与技术,2009,5(3):563-565.
LUO Yafei. The Multi-thread Communication of Socket Based on TCP[J]. Computer Knowledge and Technology,2009,5(3):563-565.
[10] 贾广雷,刘培玉,耿长欣,等.多线程技术及其在串口通信中的应用[J].计算机工程,2003,29(1):247-249.
JIA Guanglei, LIU Peiyu, GENG Changxin, et al. Multithread Technology and Its Application on Serial Communication[J]. Computer Engineering,2003,29(1):247-249.
[11] 成卫青,王雪梅,豆仁福,等.三种基本网络传送模式的编程实现与分析[J].计算机技术与发展,2011,21(7):132-137.
CHENG Weiqing, WANG Xuemei, DOU Renfu, et al. Three Basic Transfer Mode Network Programming and Analysis[J]. Computer Technology and Development,2011,21(7):132-137.
收稿日期:2015年10月7日,修回日期:2015年11月28日
基金项目:运城学院院级项目(编号:CY-2013016)资助。
作者简介:卢照,男,硕士研究生,助教,研究方向:并行计算及信息处理。
中图分类号TP393.1
DOI:10.3969/j.issn.1672-9722.2016.04.032
Application of Multi-thread Socket Communication Based on TCP in Cathodic Protection Software
LU ZhaoHE Zhilin
(Computer Science and Technology Department, Yuncheng University, Yuncheng044000)
AbstractCommunication service software is an important part of cathodic protection software system, real-time, accuracy and efficiency of communication directly affect the entire cathodic protection software performance and decision-making. .NET Framework Socket class is socket services Winsock32 API. To achieve network programming, a number of methods are provided, with the Socket class network program will be very easy. Software uses multi-threading technology, using a TCP socket communication, and applied to the actual cathodic protection software system to achieve real-time communication between the terminal device and the server, for the cathodic protection software provides real-time data information, played on terminal equipment status in real-time monitoring role. Systems in practical applications and real-time stability are relatively satisfactory.
Key Wordsnetwork communication, multi-threaded, Socket, TCP