基于c的远程液位监控软件设计毕业设计(论文)(编辑修改稿)内容摘要:

AsyncCallBack:代表回调函数 ; state: 代表 状态信息,必须 确保 state中包含 socket 的句 ; 调用 BeginAccept 方法的根本流程是: 建立本机 终节点,湖南理工学院毕业设计(论文) 9 并 建立 新的 socket 与 本机 终节点进行绑定; 在端口上 监听 是否有新的连接申请; 申请开始接入新的连接 ,将其传入 Socket 的实例或者 StateOjbect 的实例。 调用 BeginAccept()方法 完成 后, 当有 新的连接 产生 , 就会使用 回调函数,此 回调函数 一定 得 包含 用于 终结 接入连接操作的 EndAccept()方法 ,其原型为: Socket EndAccept(IAsyncResult iar)。 那么服务器构建代码如下: public static void StartListening() { IPAddress local = (,0,1)。 IPEndPoint iep = new IPEndPoint(local,13000)。 Socket listener = new Socket(, )。 (iep)。 (20)。 (new AsyncCallback(Accept), listener)。 } void Accept(IAsyncResult iar) { Socket MyServer = (Socket)。 Socket service = (iar)。 } ( 2)发送与接收数据 在 创建 了套接字的连接后,就 能够 使服务器端和客户端之间进行数据 通信了。 异步 通信 用 BeginSend 和 EndSend 方法来 完成 数据发送。 在 使用 BeginSend方法前要确认双方都已成功连接, 不然 会出错误。 BeginSend 方法原型为: (Byte[],Int32, Int32, SocketFlags, AsyncCallback, Object); 参数如下: buffer: Byte 类型的数组,包含将发送的数据; offset: buffer 参数中发送数据的起始位置,该位置从零开始计数; size:将发送的字节数;socketFlags: SocketFlags 值的按位组合; callback: AsyncCallback 委托;state:一个对象,包含此申请的状态消息;返回值:调用异步通讯发送IAsyncResult。 创建一个完成 AsyncCallback 的回调方法并将名字传入 湖南理工学院毕业设计(论文) 10 BeginSend 方法。 state 参数一定得包含用来通讯的连接。 如果回调要求更多信息,那么可构建一个小型的类用于存储 Socket和其他必须的信息。 经过 state 参数将此类的一个实例传递给 BeginSend 方法。 回调方法应使用 EndSend 方法。 当应用程序使用 BeginSend 方法时,系统将运用一个单独的线程完成特定的回调方法,并阻止 EndSend,直到 Socket 发送了申请的字节数或引发了异常。 相关代码如下: private static void Send(Socket handler, String data) { byte[] byteData = (data)。 (byteData,0,0,new AsyncCallback(SendCallback), handler)。 } private static void SendCallback(IAsyncResult ar) { try { Socket handler = (Socket)。 int bytesSent = (ar)。 ()。 ()。 } catch (Exception e) { } } 异步通信用 BeginReceive 和 EndReceive 方法 来接收数据,其 BeginReceive方法原型为: (Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object) 参数如下: buffer: Byte 类型的数组,它是保存接收到的数据的位置; offset:buffer 参数中保存所接收数据的位置,该位置从零开始计数; size:要接收的字节数; socketFlags : SocketFlags 值的按位组合; callback:一个AsyncCallback 委托,它援用操作完成时要应用的方法; state:一个用户定义对象,其中宝库接收操作的相干信息。 操作完成时,此对象会传软 EndReceive方法;返回值:使用异步方法读取 IAsyncResult。 异步 BeginReceive 操作应使湖南理工学院毕业设计(论文) 11 用 EndReceive 方法完成。 一般该方法由 callback 实现。 在操作完成前方法不会进入阻塞状态。 如需一直阻塞到操作完成时则应使用 Receive 方法进行重载。 相关代码如下: private static void Receive(Socket client) { try { StateObject state = new StateObject()。 = client。 (,0,0,new AsyncCallback(ReceiveCallback), state)。 } catch (Exception e) { } } private static void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject)。 Socket client =。 int bytesRead = (ar)。 if (bytesRead 0) { ((,0,bytesRead)。 (,0,0,new AsyncCallback(ReceiveCallback), state)。 } else { 湖南理工学院毕业设计(论文) 12 if ( 1) { response = ()。 } ()。 } } catch (Exception e) { } } 这里对接收的数据做了一些处理, 首先处理连接的回调函数里 获得 的通讯套接字 client, 然后 开始接收数据。 当数据发送到缓冲区中, BeginReceive 方法尝试 从 buffer 数组中 获取 长度为 的数据块,并且返回接收到的数据量 bytesRead。 经过判断返回值 bytesRead的大小来判断数据是否传输完全。 这里出现了 Set()方法,引出了 程序阻塞 和 异步中的同步问题。 .Net 里提供了 EventWaitHandle 类来表示一个线程的同步事件。 EventWaitHandle 即事件等待句柄,他允 许线程通过操作系统互发信号和等待彼此的信号来达到线程同步的目的。 这个类有 2个子类,分别为 AutoRestEevnt(自动重置 )和 ManualRestEvent(手动重置 )。 下面是线程同步的几个方法: (1)Rset 方法:将事件状态设置为非终止状态,使得线程阻塞。 这里的线程阻塞是指同意其他需要等候的线程进行阻塞即让含 WaitOne()方法的线程阻塞; (2)Set 方法:将事件状态设置终止状态,允许一个或多个等候线程继续。 该方法发送一个信号给操作系统,让处于等候的某个线程从阻塞状态转变成继续运行,即 WaitOne方法的线程不在阻塞; (3)WaitOne 方法:阻塞当前线程,直到当前的等候句柄收到信号。 此方法将一直使本线程处于阻塞状态直到收到信号为止,即当其他非阻塞进程使用 set方法时可以继续执行。 客户端设计 界面设计 客户端界面设计方法和服务器方法相同,首先 创建 Windows 窗体应用程序,打开工具箱,拖出我们所需的工具控件如: Lable、 Button、 TextBox 等进行界面设计,之后修改其对应的属性,双击后则可进行其他部分的代码编写。 最终界面如图 所示。 湖南理工学院毕业设计(论文) 13 图 client 界 面设计 Socket 编程 客户端的 Socket 编程同样分为以下两个步骤: ( 1)建立客户端连接 首先要创建 Socket 对象的实例,可以经过 Socket 类的构造方法来实现: Socket socket= new Socket(, )。 然后获取所要连接的服务器 IP 地址和端口: IPAddress ip=()。 IPEndPoint iep=new IPEndPoint(ip,11000)。 而后 在同步模式中,客户端调用 Connect 方法连接服务器。 在异步模式下,客户端则 使用 BeginConnect 方法和 EndConnect 方法来 完成 与服务器的连接 ,BeginConnect 方法原型为: (EndPoint, AsyncCallback, Object); 其参数: remoteEP:表示远程主机 IP地址和端口号; callback: AsyncCallback委托; state:一个对象,它包含此请求的 状态信息;返回值: IAsyncResult,它引用异步连接。 在调用 BeginConnect 方法时必须注册相应的回调函数并且至少传递一个 Socket 的实例给 state 参数,以保证 EndConnect 方法中能使用原始的套接字。 调用代码如下: private static void StartClient() { 湖南理工学院毕业设计(论文) 14 Socket socket=new Socket(,ProtocolType.Tcp)。 IPAddress ip=()。 IPEndPoint iep=new IPEndPoint(ip,13000)。 (iep, new AsyncCallback(Connect),socket)。 } void Connect(IAsyncResult iar) { Socket client=(Socket)。 try { (iar)。 } catch (Exception e) { } } ( 2)发送与接收数据 在建立了套接字的连接后,就可以服务器端和客户端之间进行数据通信了。 异步 通信 用 BeginSend 和 EndSend 方法来负责数据的发送。 前面已经介绍,这里不再赘述。 本章小结 本章先是讨论了监控软件的设计方案,选择了可靠性高的 TCP/IP 协议和实效性高的异步通信模式。 然后分别讲解了服务器和客户端的实现代码,包括界面设计和 SOCKET 编程设计。 湖南理工学院毕业设计(论文) 15 第 4 章 ActiveX 控件生成与发布 控件生成与发布 ActiveX 控件又称 Ocx 控件,用于远程液位监控系统中组态 软件的调用。 本文中使用 C语言生成的 AxtiveX 控件并非真正意义上的 ActiveX 控件,而是 .dll控件,不过足够满足 VS20xx, Web 等多种软件调用。 要生成可供组态软件调用的Ocx 控件,还需做不同的处理。 因此本文不做描述,仅介绍 C环境下生成 .dll控件的方法,具体步骤如下: ( 1) 创建一个应用程序解决方案,并添加一个 Windows 控件库项目 ,如图 图 创建解决方案 ( 2) 更改 “ 项目属性 应用程序 程序集信息 ” 设置,勾选 “ 使程序集 COM 可见 ”,如图 图 更改项目属性 湖南理工学院毕业设计(论文) 16 ( 3) 更改 “ 项目属性 生成 ”属性 ,勾选 “ 为 COM Interop 注册 ”( 此处 若是 在debug 状态下修改的,那在调到 release 状态下还 应该 再设置一次 )如图 图 更改项目属性 ( 4) 修改 文件, 增加 [assembly: AllowPartially TrustedCallers()]项(需要使用 名称空间) ,如图 所示 图 修改 文件 ( 5) 添加一个 Windows 用户控件 湖南。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。