摘要: 其实这篇文章在一年前就应该写了,不过一直觉得自己没空,一拖就拖到现在。先对大家说句对不起了。在之前的文章中,我们讲了如何在.NET 2.0下面开发Socket项目。其中的异步Socket让我们得以很轻松的在.NET中开发高性能服务端应用。但是,在实际应用中我们还是发现了一些问题的存在,如:我们在每一次操作的过程中都要创建一个IAsyncResult上下文对象,如果数据通讯很频繁的话,会导致大量的IAsyncResult对象被创建,大大的增加了垃圾回收器的工作量,从而降低了整个应用的效率。在.NET 3.5中,这个麻烦已经被解决了,在3.5 版本中,Socket定义了一些新的方法。这些方法不要求 阅读全文
posted @ 2011-05-18 21:22 孤獨龍 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 在Socket应用开发中,还有一个话题是讨论的比较多的,那就是数据接收后如何处理的问题。这也是一个令刚接触Socket开发的人很头疼的问题。因为Socket的TCP通讯中有一个“粘包”的现象,既:大多数时候发送端多次发送的小数据包会被连在一起被接收端同时接收到,多个小包被组成一个大包被接收。有时候一个大数据包又会被拆成多个小数据包发送。这样就存在一个将数据包拆分和重新组合的问题。那么如何去处理这个问题呢?这就是我今天要讲的通讯协议。所谓的协议就是通讯双方协商并制定好要传送的数据的结构与格式。并按制定好的格式去组合与分析数据。从而使数据得以被准确的理解和处理。那么我们如何去制定通讯协议呢?很简单 阅读全文
posted @ 2011-05-18 21:17 孤獨龍 阅读(1893) 评论(0) 推荐(0) 编辑
摘要: 今天,我们来讲一下在.NET 网络应用程序开发中同步Socket的应用,很多人认为在网络应用的服务端Socket不应该使用同步Socket。是的,在大多数情况下是这样的,但是也有一些场景下我们使用同步Socket可能会得到更的结果。如在下面的两种场景下我们便可以考虑使用同步的Socket。一、客户端数量比较少:数量比较少是指会同时连接到服务器的客户端数量一般在50人以下。这种情况下我们可以考虑使用同步Socket+Thread来实现我们的服务端。这样会让我们编写逻辑更清晰的代码而性能不会下降太多。二、客户端数量较多但都是短连接:短连接是指客户端的连接在处理完一次收发之后就产即断开的场景,比如说 阅读全文
posted @ 2011-05-18 21:08 孤獨龍 阅读(280) 评论(0) 推荐(0) 编辑
摘要: IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 进程间通信 (IPC) 系统在同一计算机上的应用程序域之间传输消息。在同一计算机上的应用程序域之间进行通信时,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本机应用之间通信。所以,在客户端和服务端在同一台机器时,我们可以通过注册IPCChannel来提高Remoting的性能。但如果客户端和服务端不在同一台机器时,我们不能注册IPCChannel。下面让我们来看看如何使用IPCChannel:首先我们定义一个RemotingObject类:using System;// 远程对象 阅读全文
posted @ 2011-05-18 20:49 孤獨龍 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 一、什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分。这种多重绑定便称之为端口复用。二、我们如何实现Socket端口复用: 其实我们要实现端口复用很简单,我们只要使用SetSocketOption函数设置Socket选项就可以了。MSDN是这样解释的:Socket 选项确定当前 Socket 的行为。对于具有 Boolean 数据类型的选项,指定非零值可启用该选项,指定零值可禁用该选项。对于具有整数数据类型的选项,指定适当的值。Socket 选项按照协议支持程度来分组。我们 阅读全文
posted @ 2011-05-18 20:44 孤獨龍 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接。服务端采用C#开发,客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得,现在写出来和大家分享一下。那网络异常断开原因主要有那些呢?归纳起来主要有以下两种:1、客户端程序异常。 对于这种情况,我们很好处理,因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常(就是WinSock2中的10054异常)。只要在服务端处理这个异常就可以了。2、网络链路异常。 如:网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样 阅读全文
posted @ 2011-05-18 20:36 孤獨龍 阅读(365) 评论(0) 推荐(0) 编辑
摘要: 从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用”(原文为:“typed reference” 也就是delegate??)“回调”他的老板来实现他的承诺,如下: class Worker { public void Advise(Boss boss) { _boss = boss; } public void 阅读全文
posted @ 2011-05-18 19:57 孤獨龍 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 在基于.NET的网络服务端的开发中,我们用到和听到的最多的恐怕就是异步Socket了。异步Socket的性能比同步高出很多,但是编写代码比较复杂。因此异步Socket也是网络上讨论比较多的话题。今天,我们就来讨论一下如何用异步Socket开发网络应用。在此之前我们先讨论两个问题。一、异步Socket是如何工作的:那异步Socket是如何工作的呢?我以接收一条消息来说明这个问题。首先,程序向系统投递一个接收数据的请求,并为其指定一个数据缓冲区和回调函数,回调函数用来指示当数据到达后将如何处理,然后我们的程序继续执行下去,当有数据到达的时候,系统将数据读入缓冲区,并执行回调函数,处理这条消息。我们 阅读全文
posted @ 2011-05-18 19:54 孤獨龍 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 一段比较经典的多线程学习代码。 1、用到了多线程的同步问题。 2、用到了多线程的顺序问题。 如果有兴趣的请仔细阅读下面的代码。注意其中代码段的顺序,思考一下,这些代码的顺序能否互相调换,为什么?这应该对学习很有帮助的。为了演示,让所有的线程都Sleep了一段时间。using System.Net;using System;using System.IO;using System.Text;using System.Threading;using System.Diagnostics;namespace Webb.Study{ class TestThread { static Mutex m_ 阅读全文
posted @ 2011-05-18 19:52 孤獨龍 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。 .NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并提示消息:“从不是创建控件 control name 的线程访问它。” 可以通过将 CheckForIllegalCrossThreadCall 阅读全文
posted @ 2011-05-18 19:51 孤獨龍 阅读(364) 评论(0) 推荐(0) 编辑