Visual C#建立简单消息传递系统(1)

visual

 摘要:本文讨论基于套接字(socket)的体系结构以及怎样建立一个高效的、易于使用的、可以同时在PC和Pocket PC上运行的消息传递(message-passing)系统。

  套接字和消息

  目前,大多数Web服务和所有的远程应用程序都使用了远程过程调用(remote-procedure-call,RPC)方法。你所做工作好像是在调用一个函数,但是在其后台执行了大量的操作以确保它在服务器上发生。在较低的层次,系统是在两台计算机之间传递消息,但这是不可视的。

  然而,当你转换到套接字操作的时候,你就在纯粹的基于消息的系统中编程了。这会改变你编写的代码的类型,因为读取返回的数据的唯一途径是通过消息。它与使用无返回值或输出参数的.NET类有点类似,在这些情况下所有的返回信息都需要通过事件传递。

  由于我希望服务器程序告诉客户端什么时候应该改变曲目,使用消息就很有利,因为信息可以从服务器到达客户端,不需要客户端明确地请求该信息。但是,它要求你使用不同的方式达到目标。

  在解释所有操作之前,我想先谈论一点点安全性方面的问题。如果你在自己的计算机上打开了某个端口,其它人可能利用这个端口做不利的事情。他们可能希望写入没有意义的信号,以确定自己是否能够控制你的计算机或者使它崩溃。当你编写这类应用程序的时候考虑一下这种可能性是必要的。我的例子将运行在防火墙后面的网络上,所以我感觉到相对安全。

  简单的套接字

  我从建立一个服务器程序开始,它能给一个整数加上1,下面是服务器端代码:

public static void Main()
{
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(localAddr, 9999);

Console.WriteLine("Waiting for initial connection");
listener.Start();
Socket socket = listener.AcceptSocket();
Console.WriteLine("Connected");
NetworkStream stream = new NetworkStream(socket);
BinaryReader reader = new BinaryReader(stream);
BinaryWriter writer = new BinaryWriter(stream);

int i = reader.ReadInt32();
i++;
writer.Write(i);
}

  它首先在本机的9999端口上建立了一个TCP监听器,接着启动监听器并等待连接。一旦得到了连接,它就接收一个整数,给它加1,并把它发送回去。

  需要指出的是我在此处使用的本地地址是127.0.0.1。在测试的时候这种情形可以很好地运行,这个时候客户端和服务器程序在相同的计算机上运行,但是当它们在不同的计算机上运行时,程序就不能运行了。在后面的部分中我将给出更复杂的代码。

 传递消息

  通过套接字传递未经处理的数据毫无乐趣,而通过套接字传递对象可能更有趣一些。为了达到这个目标,我们需要一个得到对象并把它转换为字节流的途径。最明显的解决方案是使用运行时(runtime)提供的串行化(serialization)支持。不幸的是,使用这种方法会有少量的问题。

  第一个问题是串行化需要很大的开销,这意味着它使用的字节比传递数据必要的字节多一些。如果使用SOAP格式化,这个问题就更严重。这是否成为一个问题依赖于应用程序的性能需求。第二个问题是串行化在简洁框架组件中不能使用。由于没有简单的实现方法,我们需要自己做这个工作。在这个过程中,我们做的事情比串行化要少多了。

  我们从建立一个枚举开始,它定义了可以传递什么类型的消息:

public enum MessageType
{
RequestEmployee = 1,
Employee,
}

  对于每种消息类型,我们需要一个对象定义该对象:

public class RequestEmployee: ISocketObject
{
int id;
public RequestEmployee(int id)
{
this.id = id;
}

}

public RequestEmployee(BinaryReader reader)
{
id = reader.ReadInt32();
}

public int ID
{
get
{
return id;
}
}

public void Send(BinaryWriter writer)
{
writer.Write((int) MessageType.RequestEmployee);
writer.Write(id);
}
}

  我们使用的这种途径与ISerializable接口很相似。ISocketObject接口定义了一个Send()函数,它串行化通过通道的数据,接着还有一个并行化该数据的构造函数。

  在这些对象中的某个串行化自身的时候,它发送的第一个信息是消息标识符。它让接收者知道将到达哪种类型的对象并建立该对象。下面是客户端的代码:

RequestEmployee requestEmployee = new RequestEmployee(15);
requestEmployee.Send(writer);

MessageType messageType = (MessageType) reader.ReadInt32();

switch (messageType)
{
case MessageType.Employee:
Employee employee = new Employee(reader);
Console.WriteLine("{0} = {1}", employee.Name, employee.Address);
break;
}

  RequestEmployee这段代码建立了一个对象并把它发送给服务器程序,接着它找出返回的是哪种对象,并且并行化它。

  尽管这个示例项目被标记为client和server,但是两者之间唯一真正的差别是连接建立的方式。当这个过程完成后,它们都使用相似的代码发送和接收消息,即使它们需要处理自己的消息集合。

时间: 2024-10-29 02:23:02

Visual C#建立简单消息传递系统(1)的相关文章

Visual C#建立简单消息传递系统(2)

visual 面向对象设计vs.实用主义 这种方法的缺点之一是你必须使用一个大的switch语句结束,但是前辈一直教导我们大的switch语句是较差的设计的表现.通常的面向对象(Object Oriented,OO)的途径是使用多态性(polymorphism)的.为了达到这个目的,我们先建立一个抽象的基类(base class),接着从该类衍生出所有的消息对象.每个类需要执行串行化.并行化和处理消息等多个方法,主要的代码是: · 读取消息类型 · 建立实例(使用反射) · 调用虚HandleM

利用JMS建立消息传递系统

在开始之前需要说明,为了理解本文,我们希望读者拥有Java编程的相当坚实的基础.我们将试图尽可能简单地解释什么是JMS,但是在你能够建立自己的程序并正确地理解它们之前,你需要有一些使用JNDI开发实际应用程序的经验. JMS(Java消息服务)是一个消息交换标准,它允许使用J2EE应用程序组件建立.发送.接收和读取消息.它假设分布式通讯拥有自由(free)的连接.是可靠的(reliable)和异步的(asynchronous). Exchange(交换)系统 消息交换反映了程序组件或应用程序之间

用ASP.NET建立简单的新闻发布系统

下面是一个建立新闻发布系统的程序,不用和数据库打交道哦 步骤: (1).在vs2005中新建网站,新建三个aspx网页,分别命名:title.aspx,news.aspx,main.aspx其中title.aspx用来设置标题,可以自己设计,写几个字也行,news.aspx用来显示新闻标题,main.aspx用来显示新闻内容. (2).新建htm页,用来设计框架.代码如下: <html xmlns="http://www.w3.org/1999/xhtml" > <h

SSRS入门(二) 建立简单的报表

报表服务是微软SQLSERVER商业智能其中的一个组件,借助报表服务,用户可以制作各种各样的报表,无论是简单的还是复杂的报表,同时系统提供订阅功能方便用户对报表进行订阅.此外,开发人员也可以很容易地把一个SSRS报表集成到自己的winform或者webform程序中. 此篇将介绍如何建立简单的报表,通过此篇你将对建立报表项目的步骤有一个了解. 首先,打开SQL Data Tools,也就是Visual Studio 2010的Shell.跟商业智能相关的项目,比如集成服务项目,分析服务项目等都需

Python写的一个简单监控系统

  这篇文章主要介绍了Python写的一个简单监控系统,本文讲解了详细的编码步骤,并给给出相应的实现代码,需要的朋友可以参考下 市面上有很多开源的监控系统:Cacti.nagios.zabbix.感觉都不符合我的需求,为什么不自己做一个呢 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 首先数据库建表 建立一个数据库"falcon",建表语句如下: ? 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE `stat` ( `

代码-菜鸟提问:关于网站建立的树系统解析

问题描述 菜鸟提问:关于网站建立的树系统解析 菜鸟一名,想请大师概念式系统的描述下网站制作需要的软件(如果知道相同功能的软件最好指出软件之间的不同之处),以及需要学习的代码和代码所实现的功能.谢谢 比如 首选要学习html,它在网页中充当什么角色,实现什么功能,编辑软件常用的是哪些,各自有什么不同之处 其次要学习------ 不胜感激 解决方案 cmcc c++ 解决方案二: 首选要学习 html 它是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言.HTML文件是由HTML命令组成的描

python实现的简单抽奖系统实例

  本文实例讲述了python实现的简单抽奖系统.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #!/usr/bin/env python #coding=u

C语言有谁编过一个简单的系统吗?学生信息管理系统 求助!用C++编程

问题描述 C语言有谁编过一个简单的系统吗?学生信息管理系统 求助!用C++编程 各项功能说明 (1)学生基本信息的录入和保存: 这部分的功能主要包括信息的录入和保存和总分.平均分的计算,首先按程序提示输入所要输入的学生人数,接着是分别输入有关学生的相关信息包括学号.姓名.年龄.性别以及学生各科成绩的分数等.在录入数据的同时,系统将对信息的合法性进行检验(学号范围为100~200.姓名不限.年龄为15~50岁.性别可输入m或f.各科成绩均限定在0~100之间),若用户录入了不合法的数据系统将会作出

c#-Silverlight balder建立简单位移动画时出现问题

问题描述 Silverlight balder建立简单位移动画时出现问题 初学Silverlight和balder,使用Silverlight4和balder 0.8.8.9建立项目, 试用coordinateAnimation创建一个方块位移的简单动画. 代码如下: namespace _3Dani { public partial class MainPage : UserControl { Game game = null; Balder.Objects.Geometries.Box te