查看文章 |
面向连接的TCP,消息边界问题
2009-03-23 08:55
在前面的几篇中,讲了关于套接字Socket以及利用套接字助手类来进行服务端和客户端之间的通信,在此中间并没有对发送的信息进行任何的处理。在本篇中将会讲一下TCP通信时的信息边界问题。 通 过套接字或其助手类来接收信息时,是从缓存区里一次性把全部的缘存都读取出来,只要你设置的缓存够大,它就能读取这么多,这样就会导致这样的情况出现。如 果服务端连续发送信息到客户端,如我连续发送字符串“message 1”、“message 2”、“message 3”、“message 4”、“message 5”,我预想的是在客户端也是能够收到这样的五个完整的字符串,如果用前二篇中讲的方法,在同台机子上测试的话,是正常的,因为同台机子上网络信息传送出 现的异常会比较少,但如果把客户端与服务端部署在不同的机器上,则会出现一些异想不到的现象。你会发现接收到的字符都被打乱了,会出现如 “3message 4”的字符串,这样的话,我们就不能把服务端发送的信息正常的还原。这个就是消息的边界问题,要解决这个问题,方法有很多,现抽取其中几个来讲一下: 1、固定尺寸的消息 这 是最简单但也是最昂贵的解决TCP消息问题的方案。就是要设计一种协议,永远以固定的长度传递消息,通过将所有的消息都设置为固定的尺寸,在从远程设备中 接收到完整的消息时,TCP接收程序就能够了解发送的情况了。用这各地意味着必须将短消息加长,造成网络带宽资源的浪费。 2、使用消息尺寸信息 这个方案允许使用可变长度的消息,惟一的不足就是接收端的远程设置必须了解每一个变长消息的确切长度。具体的方法是,在发送消息的时候,一起发送该消息的长度。那么在客户端接收的时候就能知道该消息的长度是多少,再来读取消息。 3、使用消息标记 该 方案使用预先确定的一个字符(或多个字符)来指定消息的结束,通过这种方式来分隔不同的消息。但用这种方法必须对所接收到的每一个字符进行检查以便确定为 结束标记,这对于大型消息来说,可能导致系统性能的下降,不过对于C#语言来说,提供了一些类,能够用于简化这个过程,那就是System.IO命名空间 流类,下面我们也着重来讲一下这各方法。至于第二种方法,将在下一篇中与在消息中传送实体类信息相结合来讲述。 |
最近读者: