收藏 分销(赏)

大学毕业设计---基于c#的远程液位监控软件设计.doc

上传人:鼓*** 文档编号:9874495 上传时间:2025-04-11 格式:DOC 页数:44 大小:724KB
下载 相关 举报
大学毕业设计---基于c#的远程液位监控软件设计.doc_第1页
第1页 / 共44页
大学毕业设计---基于c#的远程液位监控软件设计.doc_第2页
第2页 / 共44页
点击查看更多>>
资源描述
学号 毕业设计(论文) 题目: 基于C#的远程液位监控软件设计 作 者 届 别 学 院 专 业 指导教师 职 称 完成时间 年 月 日 湖南理工学院毕业设计(论文) 摘 要 为了弥补组态软件在远程液位监控系统中的不足,本文设计了一套基于C#的远程液位监控软件。本软件依靠.NET类库中Windows.Forms类完成了服务器与客户端测试界面的设计,还利用SOCKET类实现了服务器与客户端之间的异步通信,达到了实时传输和远程监控的要求。同时利用内部的垃圾回收机制,有效的避免了资源浪费和内存泄露等缺陷。在满足企业个性化设计需求的同时还保证了测控平台的工作性能和测控质量,极大的提高了工业生产效率。 关键词:C#;SOCKET;异步通信; Abstract To make up for deficiencies in the remote configuration software level monitoring system, the paper designs a C # based on the level of remote monitoring software. The software relies on .NET class library Windows.Forms class completed the test server and the client interface design, but also use SOCKET class implements the asynchronous communication between the server and the client, to the real-time transmission and remote monitoring requirements. While taking advantage of the internal garbage collection mechanism, effectively avoiding the waste of resources and memory leaks and other defects. Personalized design to meet business needs, while also ensuring the quality and control performance and control platform, which greatly improves the efficiency of industrial production. Keywords: C #; SOCKET; asynchronous communication; 目 录 摘 要 I Abstract II 第1章 引 言 1 1.1 课题研究的背景 1 1.2 课题研究的意义 1 1.3 课题研究内容及结构安排 2 第2章 系统整体结构 3 2.1 控制系统构成 3 2.2 测控软件构成 4 2.2.1 相关技术介绍 4 2.2.2 程序流程框图 5 2.3 本章小结 6 第3章 监控软件程序实现 7 3.1 软件设计方案 7 3.2 服务器设计 7 3.2.1 界面设计 7 3.2.2 Socket编程 8 3.3 客户端设计 12 3.3.1 界面设计 12 3.3.2 Socket编程 13 3.4 本章小结 15 第4章 ActiveX控件生成与发布 16 4.1 控件生成与发布 16 4.2 本章小结 21 第5章 软件生成与测试 22 5.1 软件生成及测试 22 5.2 本章小结 25 第6章 结语与展望 26 参考文献 27 致 谢 28 附录 软件代码 29 40 第1章 引 言 1.1 课题研究的背景 随着科技的不断发展,远程监控技术以其逐步完善和推广,逐渐使人们意识到远程测控技术对现代企业管理和生产效率的重要意义。为了提高生产效率,人们希望获得对工厂生产中大量的物理量和生产工艺等参数的实时测控。但是以往的监测技术已经无法满足当代工业生产的需求。伴随着通讯技术、电子技术和计算机网络技术的快速发展,丰富的网络资源以及不断降低的成本为网络化远程监控系统提供了可能。 液位监控是当代工业测控中较为普遍的一类问题,在石油、化工、电力等工业部门中应用极为普及,是工业生产过程当中的一个重要构成部分。针对传统工业生产中液位过程所具有的非线性、时滞和时变等复杂特性,液位监控系统能够有效的模拟和监测生产中液位过程所产生的一系列物理量,并及时针对其产生的问题做出相应的调整。此外,液位过程测控平台的构建和控制方案的钻研,对工业生产中施行液位过程控制具备重要的指导作用。 1.2 课题研究的意义 当前国内外大多数企业都使用组态软件对液位过程进行监控。组态软件是近些年在工业控制领域广泛应用的软件开发工具,可快速构建不同需求的数据采集和监控系统。应用组态软件可免去了传统测控软件编写中庞大而复杂的编程工作,大大提高了测控系统的开发效率,且保证了测控平台的工作性能和测控质量。 然而传统的组态软件在使用过程中由于系统体积的庞大,造成了巨大的资源浪费,且价格昂贵,无法满足企业各种个性化设计的要求。因此不满足大多数中小型企业的要求。针对这一问题,大部分开发人员选择使用VB或VC++等语言开发符合企业需求的监控软件。虽然利用这些语言编写的监控软件可以弥补组态软件的不足,且可以自由的对系统资源进行控制。但是由于语言本身的不完善,很容易造成系统资源浪费,内存泄露等问题,从而使得监控软件不稳定,极大地影响了监测质量。 C#是微软公司于2000年7月,专门为.NET的应用而发布的一种全新的面向对象程序设计语言,具有简单、安全等特点。C#继承了C语言的语法风格,同时又继承了C++的面向对象特性,同时拥有和VB相类似的快速开发能力。因此用C#语言开发的远程液位测控软件可以有效的弥补传统组态软件的不足,满足企业个性化的要求。利用.NET程序集、MSIL和JIT编译器实现了对组件的充分使用,而且经过内部的垃圾回收机制,可及时回收软件运行时不再使用的内存资源,避免了资源浪费和内存泄露等缺陷。 综上原因,本文提出并设计了一套基于C#远程液位监控软件。该软件不但依靠.NET类库中强大的类库资源实现了对液位过程的实时监测和远程控制,还利用内部的垃圾回收机制,有效的避免了资源浪费和内存泄露等缺陷。在满足企业个性化设计需求的同时还保证了测控平台的工作性能和测控质量,极大的提高了工业生产效率。 1.3 课题研究内容及结构安排 组态软件在工业控制中应用广泛,本文基于此研究设计了一套基于C#的远程液位监控软件,以弥补组态软件在远程监控领域的不足。论文结构安排如下: 第1章,描述了课题研究的背景和意义,阐述了基于C#远程液位监控软件的优点。 第2章,软件的总体设计,包括软件说明和功能介绍以及程序设计流程框图。 第3章,相关软件和技术的基本介绍。 第4章,软件各功能模块的具体设计与实现。 第5章,软件生成与测试结果展示。 第6章,结语与展望。 第2章 系统整体结构 2.1 控制系统构成 为了实现对水箱液位参数的精确测控以及实时监视和记录。本文设计了一套水箱液位监控系统,此监控系统采用计算机(PC)作为控制器,变频器作为执行器进行构建。监控系统结构图如图2.1所示。 水 泵 变频器 水槽 D/A LIC 101 L T 101 水箱 A/D 计算机 图2.1 水箱液位监控系统结构图 在此系统中,液位变送器LT101使用测量范围为0~60cm的阻压式液位(压力)变送器,将检测出来的水箱液位信号转变为4~20mA标准电信号。控制器LIC101采用PC机,用组态王KingVIEW6.55开发监控软件,并用C#编写可供组态王KingVIEW6.55使用的远程监控控件。A/D与D/A分别选用ADAM5018模块和ADAM5060模块,可经过RS232总线与计算机进行通讯。变频器采用西门子G110变频器,用来获取计算机发送经ADAM5060转换后的4~20mA控制信号,并完成变频调速(频率范围为0~50Hz)进而驱动水泵改变管路中的水流量,达到调节水箱液位的目的 ADAM5018/5060控制模块体积较小,易于集成,且拥有一个独立的嵌入式的RS232传输卡, 可通过RS232与PC机进行通信。底板上有4个插槽,能够插接ADAM5018/5060的I/O 模块, 从而完成快速数据的收集与控制, 因而ADAM5018/5060模块很适宜该系统。 2.2 测控软件构成 2.2.1 相关技术介绍 (1).NET框架 软件基于.NET框架的VS2010编程环境设计,.NET是一个由 Microsoft .NET Framework SDK中包括的类、值类型和接口构成的库。该库直接访问系统功能,是组成.NET Framework程序、组件及控件的基础。 (2)C/S结构 软件遵循C/S结构,设计了服务器和客户端两大块。该结构可以充分利用硬件的优点,将任务合理安排到客户端和服务器,大大减少了系统整体的通信成本。C/S 结构的根本原理是将大的任务分解为多个子任务,由多台计算机协作完成。其工作模式如图2.2所示: 图2.2 C/S结构工作模式 C/S构架的长处是能够充分利用客户端的应对能力,很多任务能够在客户端处理后再转交给服务器。这样可以大大提高客户端的响应速度。具体如下两点优势: (1)服务器处理数据负担较轻。 (2)数据的储存管理能力较为透明。 (3)SOCEKT类 服务器和客户端依靠强大的SOCKET类建立连接。完成液位过程数据采集后的传输工作,将远端设备的数据实时可靠的传输到服务器端进行检测和纪录,同时服务器也可发送数据到客户端,对远程液位设备进行调控。Socket也称"套接字",用来描绘IP地址和端口,是个通信链的句柄。在Internet上的主机通常都会运行多个应用软件,并且提供多种服务。而每个服务程序都会构建相应的SOCKET与端口一一对应,从而让不同端口拥有不同服务。Socket本质上供应了过程通信的端点。Socket连接过程能够分为三步:服务器侦听、确认连接和客户端申请。 (1)服务器侦听:服务器端socket不是定位详细的客户端socket,而是处于等候连接的状况,实时监测网络状况。 (2)客户端申请:是指由客户端提出连接申请,要连接的目标是服务器端的套接字。因此,客户端的socket首先得描绘它所要连接的服务器,确认服务器端socket的IP地址和端口号,进而向服务器端提出连接申请。 (3)确认连接:指当服务器端socket监听到客户端socket的连接申请时,它会回应客户端socket的申请,创建一个新的线程,将服务器端socket的叙述发给客户端,当客户端确定了此叙述,就会成功握手建立连接。而服务器端socket还将处于监听状态,等待接收其他客户端socket的连接申请。 2.2.2 程序流程框图 系统根据C/S架构,分别创建服务器和客户端。服务器首先创建socket()套接字,利用bind()方法绑定本地IP和端口,用listen()方法监听端口请求,。侦听到端口有连接申请时,调用accept()方法接受请求,而后用receive()/send()方法对数据进行读/写操作,传输完成时使用close()函数关闭服务器。同样客户端也先创建socket()套接字,获取要连接服务器的IP和端口,使用connect()方法发送连接请求,而后使用receive()/send()函数进行数据的读/写,传输完成时使用close()函数关闭客户端。系统程序框图如图2.3所示: 图2.3系统程序框图 2.3 本章小结 本章描述了远程液位监控系统的整体架构设计。包括液位监控系统的各部分组成,监控软件设计所涉及的相关技术介绍,如:.NET框架、C/S结构和SOCKET编程等,以及系统设计的程序框图说明。 第3章 监控软件程序实现 3.1 软件设计方案 监控软件设计的核心在于服务器和客户端之间的实时通信。本文提供了两种通信协议,分别是面向连接的TCP/IP协议和无连接的UDP协议,然而在工业控制中必须保证数据传输的可靠性,因此我们选择了安全性高的TCP/IP协议作为通讯协议。此外本文还提供了同步通信和异步异步通信两种模式可供选择。同步通信属于串行通信,用次模式,要求客户端在发送一条请求后,必须等到服务器做出相应回应,才能够发送下一条请求。异步通信属于并行通信,此模式下客户端发送一条请求之后,不必等到服务器做出相应回应就可发送下一条请求。在工业控制中,往往需要保证数据传输的实时性,同步通信模式显然不符合要求,因此我们选择能实时传输的异步通信模式。 3.2 服务器设计 3.2.1 界面设计 为了方便演示与测试,创建Windows窗体应用程序,进行软件设计。而要生成ActiveX控件则需要创建Windows控件库项目,但两者界面设计的方法一致(注:该服务器界面以及下章的客户端界面仅为测试通信使用,作为Active控件发布的界面数据无需手动输入,数据采集完成后直接存储到内部Buffer进行发送。而正式的工业液位监控界面由组态王设计,本文不介绍)。创建好项目后,打开工具箱,拖出我们所需的工具控件如:Lable、Button、TextBox等进行界面设计,之后修改其对应的属性,双击后则可进行其他部分的代码编写。最终界面如图3.1所示。 图3.1 server界面设计 3.2.2 Socket编程 Microsoft.Net Framework 为程序访问Internet实现了可分层、可扩展的网络服务,其命名空间System.Net和System.Net.Sockets包含大量的类能够便于网络通讯程序的开发。所以在编写前应该添加using System.Net、using System.Net.Sockets和using System.Threading三个命名空间。具体编程可分为以下步骤: (1)建立服务器连接 首先要创建Socket对象,使用Socket类的构造方法实现: Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 参数如下:AddressFamily:Socket使用的寻址方案;SocketType:Socket类型;ProtocolType:Socket使用的协议,这里所用的是TCP/IP协议。 当创建Socket后,服务器端则要通过Bind()方法绑定所指定的端口,使Socket和一个本地终端相联。这里在服务器端可设置两种方式进行连接,一种是DNS创建域名接连的方式: IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 另一种是IP地址的连接方式: IPAddress ipAddress = ipHostInfo.AddressList[0]; 这里是系统自动获取本机IP,也可以手动输入IP地址方法如下: IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 这里采取IP地址连接的方式,设置好IP地址和端口号后使用Bind()方法进行绑定: IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); listener.Bind(localEndPoint); 然后通过Listen方法监听该端口上的连接申请,当监听到端口的连接申请后。同步模式时,服务器调用Accept方法允许连接申请。异步模式时,服务器能够调用BeginAccept方法和EndAccept方法实现与客户端的通信。BeginAccept在异步模式下尝试连接,它准许其余进程直接运行,而不必等候连接建立。在使用BeginAccept方法之前,必需调用Listen方法来监听连接申请,BeginAccept的函数原型为: BeginAccept(AsyncCallback AsyncCallback, Ojbect state); 这里AsyncCallBack:代表回调函数;state:代表状态信息,必须确保state中包含socket的句;调用BeginAccept方法的根本流程是:1、建立本机终节点,并建立新的socket与本机终节点进行绑定;2、在端口上监听是否有新的连接申请;3、申请开始接入新的连接,将其传入Socket的实例或者StateOjbect的实例。调用BeginAccept()方法完成后,当有新的连接产生,就会使用回调函数,此回调函数一定得包含用于终结接入连接操作的EndAccept()方法,其原型为: Socket EndAccept(IAsyncResult iar); 那么服务器构建代码如下: public static void StartListening() { IPAddress local = IPAddress.Parse("127.0,0,1"); IPEndPoint iep = new IPEndPoint(local,13000); Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(20); server.BeginAccecpt(new AsyncCallback(Accept), listener); } void Accept(IAsyncResult iar) { Socket MyServer = (Socket)iar.AsyncState; Socket service = MyServer.EndAccept(iar); } (2)发送与接收数据 在创建了套接字的连接后,就能够使服务器端和客户端之间进行数据通信了。异步通信用BeginSend和EndSend方法来完成数据发送。在使用BeginSend方法前要确认双方都已成功连接,不然会出错误。BeginSend方法原型为: Socket.BeginSend(Byte[],Int32, Int32, SocketFlags, AsyncCallback, Object); 参数如下:buffer:Byte类型的数组,包含将发送的数据;offset:buffer参数中发送数据的起始位置,该位置从零开始计数;size:将发送的字节数;socketFlags:SocketFlags值的按位组合;callback:AsyncCallback委托;state:一个对象,包含此申请的状态消息;返回值:调用异步通讯发送IAsyncResult。创建一个完成 AsyncCallback 的回调方法并将名字传入 BeginSend 方法。state 参数一定得包含用来通讯的连接。如果回调要求更多信息,那么可构建一个小型的类用于存储Socket和其他必须的信息。经过state 参数将此类的一个实例传递给 BeginSend 方法。回调方法应使用EndSend方法。当应用程序使用 BeginSend方法时,系统将运用一个单独的线程完成特定的回调方法,并阻止 EndSend,直到Socket发送了申请的字节数或引发了异常。相关代码如下: private static void Send(Socket handler, String data) { byte[] byteData = Encoding.ASCII.GetBytes(data); handler.BeginSend(byteData,0,byteData.Length,0,new AsyncCallback(SendCallback), handler); } private static void SendCallback(IAsyncResult ar) { try { Socket handler = (Socket)ar.AsyncState; int bytesSent = handler.EndSend(ar); handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception e) { } } 异步通信用BeginReceive和EndReceive方法来接收数据,其BeginReceive方法原型为: Socket.BeginReceive(Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object) 参数如下:buffer:Byte类型的数组,它是保存接收到的数据的位置;offset:buffer参数中保存所接收数据的位置,该位置从零开始计数;size:要接收的字节数;socketFlags:SocketFlags值的按位组合;callback:一个AsyncCallback委托,它援用操作完成时要应用的方法;state:一个用户定义对象,其中宝库接收操作的相干信息。操作完成时,此对象会传软EndReceive方法;返回值:使用异步方法读取IAsyncResult。异步BeginReceive操作应使用EndReceive方法完成。一般该方法由callback 实现。在操作完成前方法不会进入阻塞状态。如需一直阻塞到操作完成时则应使用Receive方法进行重载。相关代码如下: private static void Receive(Socket client) { try { StateObject state = new StateObject(); state.workSocket = client; client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback), state); } catch (Exception e) { } } private static void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); if (bytesRead > 0) { state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead); client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback), state); } else { if (state.sb.Length > 1) { response = state.sb.ToString(); } receiveDone.Set(); } } catch (Exception e) { } } 这里对接收的数据做了一些处理,首先处理连接的回调函数里获得的通讯套接字client,然后开始接收数据。当数据发送到缓冲区中,BeginReceive方法尝试从buffer数组中获取长度为buffer.length的数据块,并且返回接收到的数据量bytesRead。经过判断返回值bytesRead的大小来判断数据是否传输完全。这里出现了Set()方法,引出了程序阻塞和异步中的同步问题。 .Net里提供了EventWaitHandle类来表示一个线程的同步事件。EventWaitHandle即事件等待句柄,他允许线程通过操作系统互发信号和等待彼此的信号来达到线程同步的目的。这个类有2个子类,分别为AutoRestEevnt(自动重置)和ManualRestEvent(手动重置)。下面是线程同步的几个方法: (1)Rset方法:将事件状态设置为非终止状态,使得线程阻塞。这里的线程阻塞是指同意其他需要等候的线程进行阻塞即让含WaitOne()方法的线程阻塞; (2)Set方法:将事件状态设置终止状态,允许一个或多个等候线程继续。该方法发送一个信号给操作系统,让处于等候的某个线程从阻塞状态转变成继续运行,即WaitOne方法的线程不在阻塞; (3)WaitOne方法:阻塞当前线程,直到当前的等候句柄收到信号。此方法将一直使本线程处于阻塞状态直到收到信号为止,即当其他非阻塞进程使用set方法时可以继续执行。 3.3 客户端设计 3.3.1 界面设计 客户端界面设计方法和服务器方法相同,首先创建Windows窗体应用程序,打开工具箱,拖出我们所需的工具控件如:Lable、Button、TextBox等进行界面设计,之后修改其对应的属性,双击后则可进行其他部分的代码编写。最终界面如图3.2所示。 图3.2 client界面设计 3.3.2 Socket编程 客户端的Socket编程同样分为以下两个步骤: (1)建立客户端连接 首先要创建Socket对象的实例,可以经过Socket类的构造方法来实现: Socket socket= new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 然后获取所要连接的服务器IP地址和端口: IPAddress ip=IPAddress.Parse("127.0.0.1"); IPEndPoint iep=new IPEndPoint(ip,11000); 而后在同步模式中,客户端调用Connect方法连接服务器。在异步模式下,客户端则使用BeginConnect方法和EndConnect方法来完成与服务器的连接,BeginConnect方法原型为: Socket.BeginConnect(EndPoint, AsyncCallback, Object); 其参数:remoteEP:表示远程主机IP地址和端口号;callback:AsyncCallback委托;state:一个对象,它包含此请求的状态信息;返回值:IAsyncResult,它引用异步连接。在调用BeginConnect方法时必须注册相应的回调函数并且至少传递一个Socket的实例给state参数,以保证EndConnect方法中能使用原始的套接字。调用代码如下: private static void StartClient() { Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPAddress ip=IPAddress.Parse("127.0.0.1"); IPEndPoint iep=new IPEndPoint(ip,13000); socket.BeginConnect(iep, new AsyncCallback(Connect),socket); } void Connect(IAsyncResult iar) { Socket client=(Socket)iar.AsyncState; try { client.EndConnect(iar); } catch (Exception e) { } } (2)发送与接收数据 在建立了套接字的连接后,就可以服务器端和客户端之间进行数据通信了。异步通信用BeginSend和EndSend方法来负责数据的发送。前面已经介绍,这里不再赘述。 3.4 本章小结 本章先是讨论了监控软件的设计方案,选择了可靠性高的TCP/IP协议和实效性高的异步通信模式。然后分别讲解了服务器和客户端的实现代码,包括界面设计和SOCKET编程设计。 第4章 ActiveX控件生成与发布 4.1 控件生成与发布 ActiveX控件又称Ocx控件,用于远程液位监控系统中组态软件的调用。本文中使用C#语言生成的AxtiveX控件并非真正意义上的ActiveX控件,而是.dll控件,不过足够满足VS2010,Web等多种软件调用。要生成可供组态软件调用的Ocx控件,还需做不同的处理。因此本文不做描述,仅介绍C#环境下生成.dll控件的方法,具体步骤如下: (1) 创建一个应用程序解决方案,并添加一个Windows控件库项目,如图4.1 图4.1 创建解决方案 (2)更改“项目属性-应用程序-程序集信息”设置,勾选“使程序集 COM 可见”,如图4.2 图4.2 更改项目属性 (3)更改“项目属性-生成”属性,勾选“为 COM Interop 注册”(此处若是在debug状态下修改的,那在调到release状态下还应该再设置一次)如图4.3 图4.3 更改项目属性 (4)修改AssemblyInfo.cs文件,增加[assembly: AllowPartially TrustedCallers()]项(需要使用System.Security名称空间),如图4.4所示 图4.4 修改AssemblyInfo.cs文件 (5)添加一个Windows用户控件 (6)为控件类增加GUID,这个编号将用于B/S系统的客户端应用时调用(能够使用 工具-创建GUID 菜单创建一个GUID,再复制),如图4.5所示 图4.5 添加GUID (7)为了使ActiveX控件获取客户端的信任,控件类还需要完成一个名为“IObjectSafety”的接口,要建立该接口(注意,不能修改该接口的GUID值),IObjectSafety.cs代码如下: (8)然后在控件类中继承并完成该接口,代码如下 (9)引用封装的FK.dll,代码如下 (10)进行封装,代码如下 (11)打包发布ActiveX,与普通的Windows Form应用程序的安装设置几乎一样,单有一个地方需要注意,将前面创建的用户控件项目作为主输出项目,并设定其Register属性为vsdrpCOM,如图4.6 图4.6 安装部署 (12)将项目文件添加。 (13)在系统文件夹system32文件夹中将msiexec.exe(卸载控件时用到)地址找到也增加至上面文件夹 (14)在“用户的程序菜单”中,新建文件夹后加入主程序与msiexec.exe快捷方式。 (15)点击项目安装工程,在属性中将ProductCode复制,点击msiexec.exe快捷方式,在属性Arguments中加入“/x+一个空隔+ProductCode”。 (16)生成项目,打包文件就完成了,打开..\Debug看到生成了2个文件,一个是xx.exe,一个是xx.msi,运行exe安装到系统。 4.2 本章小结 本章开头提出了用C#语言生成的AxtiveX控件并非真正意义上的ActiveX控件,而是.dll控件,且能够满足VS2010,Web等多种软件调用。要生成可供组态软件调用的Ocx控件,还需做不同的处理,本文不作介绍。然后详细介绍了.dll控件的生成配置和发布设置方法。 第5章 软件生成与测试 5.1 软件生成及测试 运行客户端,生成server界面,点击“启动服务器”按钮,弹出“服务器已启动,正在等待连接……”对话框,点击确定,侦听绑定端口的客户端请求。 图5.1 启动服务器 运行客户端,生成client界面。在“IP”和“端口”栏输入要连接服务器的IP地址和端口号,这里我们采用本地IP:127.0.0.1和预先设定的端口号:9050进行测试。点击连接,连接成功会弹出“连接成功,正在获取测试信息……”窗口,服务器端也会弹出请求连接的客户端IP和端口号等信息,连接失败。 图5.2 客户端成功连接 图5.3 服务器成功连接 连接成功后,服务器会向客户端发送一条“welcome here!”的测试信息以确保数据通信的通常无误。 图5.4 客户端接收测试信息 测试成功后,服务器和客户端可相互发送接收数据,内部设定先发送后接收的机制。例如:服务器向客户端发送“hello!”,客户端也可向服务器发送“How are you!”等信息。 图5.5 服务器向客户端发送消息 图5.6客户端向服务器发送消息 通信完成后,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 毕业论文/毕业设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服