基于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 用户控件 湖南。基于c的远程液位监控软件设计毕业设计(论文)(编辑修改稿)
相关推荐
字 dynamic,也同时引入了改善静态类型与动态对象的交互能力,这就是动态查找 ( Dynamic Lookup) 就像一个 object 可以代表任何类型, dynamic 使得类型决断在运行时进行,方法调用、属性访问、委托调用都可动态分派。 同时,动态特性还体现在构建一个动态对象,在 C实现 IDynamic Object 接口的类型,可以完全定义动态操作的意义,通过将 C编译器
渔船信息 编号 船名 船长姓名 船籍 建造年份 航区 主机功率 总长 型宽 型深 吨位 吃水 总线间长 船员 信息 船龄 电话 Email 住址 所在渔船编号 船员编号 姓名 性别 图 4 船员信息实体图 图 3 渔船信息实体图 9 图 5 渔船违 规记录实体图 下面列出本系统的总体 ER 图:经分析设计,各实体间联系如图所示 : 渔船违规记录 发生时间 肇事渔船编号 编号 事故简介 处理方案
aa IIIaI CBOCBOGA ...[5] 2)( TG SQNDQ VVKI ...[6] 其中 IC1为 tip122 集电极电流, IC2为 tip127 发射极的电流, 跟据 tip122, tip127 的电流,来改变 irf320G 极的电压,来控制输出电压。 同理当拔码开关选择 R5,R6 时,原理是一样的,只是输出的电压不一样。 图 pcb 原理图 图
面 图 42 前台操作 客房查询 1. 功能 通过客房号查询房间的基本类型与状态。 2. 界面 图 43 客房查询 3. 操作指南 (1).在文本框中输入客房号,点击查询,可以查询到该房间的一些基本情况。 (2).点击空房按钮的时候,会把数据库中所有的空房信息显示出来。 (3).点击未预定按钮的时候,会把数据库中所有的未预定的客房信息显 示出来。 基于 C的酒店管理系统 11 (2)
类类型、值类型和接口类型的概念形成了统一的类型系统。 尽管 C 提供了如此多的新鲜概念,但实际上,这些概念都是由 CLI 提出的。 因此当将一个 C源程序编译为可执行文件时,编译器做的工作相对而言并不多。 需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承 型定义 [10]。 C 微软在 20xx年的 6月份发布了 Visual Studio20xx的第一个 Beta 版
private void button3_Click(object sender, EventArgs e)//进入课程管理 { FrmCourse frmcourse = new FrmCourse()。 frmcourse .Show()。 } private void button4_Click(object sender, EventArgs e)//进入研究生管理 {