MSocket 控件

从我在本站预告将发表此控件至今已过去数月,耽搁这么长时间,实在不好意思。 主要是因为琐事缠身,况且从五一节后,我一直在研究 Kylix/Delphi6 ,特别是被 Delphi 6 的新 Feature 所吸引, 花了很多的时间,以至于这个控件的编写工作不断被延后。

我之所以要写这个控件,实在是因为 Borland 所提供的 TServerSocket/TClientSocket 太难用了。 其实在用 NonBlocking 时,这组控件还是相当好的,但在用于多线程阻塞方式通信时就太难用了。 所以我才写了这么一组类和一个 UDP 控件,用于多线程阻塞方式通信。这组类不能说功能很强大,但是应该说还是很好用的, 因为我是专门针对多线程阻塞方式通信应用的需要而写的。我已经把她用在一个程序里,用其中的 TCP 在 LAN 中传过十M级的文件, 没有发现什么问题。

其实这个控件来迟还有另一个原因,我在 Kylix 中看到 Borland 提供了另一组控件提供了 UDP/TCP 通信 : TUDPSocket/TTCPServer/TTCPClient ,这是一组 CLX 控件,我本想把其中的 for Linux 部分去掉后用于 Delphi 5 ,花了不少时间, 但结果却不行, I faint。


关于 1.5 版的说明:

在这里我要向大家表示“忏悔”,因为编程大师 Bjarne.Stroustrup (C++语言的发明者)说:“永远不要重新发明轮子。”,然而这一次我却干了一件“重新发明轮子”的蠢事。 TServerSocket/TClientSocket 并不是我原来想的那么难用,它其实还是挺好用的,只是用法有些不同,我不会用而已。但我却为此自己写了一组 Socket 类/控件。

为了用行动表示我的悔意,我写了一个类来封装了阻塞方式工作的 TWinSocketStream (在 MBSocket 单元),并用它实现了一个简单的新邮件检查功能。详见:《邮件检查程序》,另在 MSocket 的 DEMO 中包含了一个用于线程阻塞方式工作的 TServerSocket 的 Demo ,其中包括一个从 TServerClientThread 派生的服务端线程类的实现。

我要非常感谢几位朋友向我指出了本控件在使用中出现的问题,但由于前一段的种种原因,我一直没空改正,实在是深表歉意。    

        <p><br/></p>
        <p>更新记录:</p><p><br type="_moz"/></p><p>1.6 版(Jul.07-02)的变化(Only MBSocket):&nbsp;<br/></p><p>
          1.增加了流传输的灵活性,可以指定传输数据的长度,并且当指定数据长度时不再用默认协议,便于自定义协议。</p>
        <p><br/></p><p>1.5 版(Mar.9-02)的变化:&nbsp;<br/></p><p>
          1.修正了几位朋友指出的BUG,都是因为控件中对阻塞/非阻塞的状态设置不对造成的,起初我是用增加一个 WaitForSend 来解决,但是效率很低,在研究了 
          TServerSocket/TClientSocket 的源程序后才找到解决办法,是因为在调用 WSAAsyncSelect 后会自动设置为非阻塞方式,所以在 
          Accept 一个连接后需要重新设置为阻塞方式;<br/></p><p>
          2.增加了 SendText/RecvText 一对方法。</p>
        <p><br/></p><p>1.2 版(Nov.4-01)的变化: <br/></p><p>
          1.修正了用于 C++ Builder 5 会出错的问题(因为 BCB5 的一个 BUG ,详见 MSocket.pas 单元接口中 
          TMUDPSocket 类的注释); 通过将 SendMessage 方法改名为 SendString 来解决,同时相应地把 RecvMessage 
          也改名为 RecvString 。 <br/></p><p>
          2.修正了 TMUDPSocket 类的 RecvString 方法有时会出现 10060 的超时错的问题;通过在 recvfrom 
          之前加入 WaitForData 等待。 <br/></p><p>
          3.取消了 TMUDPSocket 的收发信息长度的限制。 <br/></p><p>
          4.将 WaitForData 放到 TMCustomSocket 中,使 TMUDPSocket 也支持此方法。 <br/></p><p>
          5. TMTCPServer/TMTCPClient 增加 SendBuf/RecvBuf, SendString/RecvString 
          两对方法。 </p>
        <p><br/></p><p>在此下载此控件(包括 MSocket 和 MBSocket 源程序和 D5/D6/BCB5/BCB6 
          版的四个 Demo):<a href="/down/dev/msocket.zip">66KB</a></p></div>

Aug.2-01, Nov.4, Mar.20, Apr.13, May.23, Jul.07-02