湖南理工学院毕业设计(论文)
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所示。
12
湖南理工学院毕业设计(论文)
图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(\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() {
13
湖南理工学院毕业设计(论文)
Socket socket=new
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip=IPAddress.Parse(\ 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编程设计。
14
湖南理工学院毕业设计(论文)
第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 更改项目属性
15
湖南理工学院毕业设计(论文)
(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用户控件
16