socket中的byte消息格式设计

这二天在研究webabcd的socket多人聊天室,想尝试增加一些功能,比如:允许用户除发送文字外,还能发送图片或文件。

问题:

socket发送数据时,只能发送byte[]数组,且无法附带其它用户自定义参数,服务端如何知道用户发过来的是文字还是图片或是文件呢,所以只能在byte数组上动脑筋了.

silverlight中,用户选择的图片或文件,都能变成FileStream,近而变成byte数组,初步想法是在数组前后加一些标记之类,比如最开始几个字节是"img,txt,file"中对应的一个,这样服务端接收到以后,通过拆解分析就能知道用户发过来的何种格式。

下面演示如何解码: 

using System;
using System.Text;

namespace byteStudy
{
 class Program
    {
 static void Main(string[] args)
        {
 string msg = "^txt^jimmy^Hello^";//格式:^类型^用户名^内容(或文件流)^

 byte[] b = UTF32Encoding.UTF8.GetBytes(msg);//模拟接收到的byte数组

 int _i1 = -1, _i2 = -1, _i3 = -1, _i4 = -1;//用来记录分隔字符“^”出现的四次位置

 for (int i = 0; i < b.Length; i++)
            {
 if (b[i] == (byte)'^')
                {
 if (_i1 == -1)
                    {
                        _i1 = i;
                    }
 else if (_i2 == -1)
                    {
                        _i2 = i;
                    }
 else if (_i3 == -1)
                    {
                        _i3 = i;
                    }
 else if (_i4 == -1)
                    {
                        _i4 = i;
                    }
                }
                Console.WriteLine(b[i].ToString());
            }


            Console.WriteLine("-------------------------------");

 if (_i1 == 0 && _i4 == b.Length - 1 && _i3 != -1 && _i2 != -1)
            {
                Console.WriteLine("_i1={0}", _i1);
                Console.WriteLine("_i2={0}", _i2);
                Console.WriteLine("_i3={0}", _i3);
                Console.WriteLine("_i4={0}", _i4);

 byte[] bFlag = new byte[_i2 - _i1 - 1];

 for (int i = _i1 + 1; i < _i2; i++)
                {
                    bFlag[i - _i1 - 1] = b[i];
                }

 string _flag = UTF32Encoding.UTF8.GetString(bFlag);

 byte[] bName = new byte[_i3 - _i2 - 1];

 for (int i = _i2 + 1; i < _i3; i++)
                {
                    bName[i - _i2 - 1] = b[i];
                }

 string _name = UTF32Encoding.UTF8.GetString(bName);


 byte[] bContent = new byte[_i4 - _i3 - 1];

 for (int i = _i3 + 1; i < _i4; i++)
                {
                    bContent[i - _i3 - 1] = b[i];
                }

 string _content = UTF32Encoding.UTF8.GetString(bContent);//如果是文件的话,用其它办法还原成流,近而变成文件或图片

                Console.WriteLine("-------------------------------");
                Console.WriteLine("类型:" + _flag);
                Console.WriteLine("用户:" + _name);
                Console.WriteLine("内容:" + _content);
            }
            Console.Read();
        }
    }
}

运行结果如下:

94 116 120 116 94 106 105 109 109 121 94 72 101 108 108 111 94 ------------------------------- _i1=0 _i2=4 _i3=10 _i4=16 ------------------------------- 类型:txt 用户:jimmy 内容:Hello

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏bluesummer

StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行...

37990
来自专栏vue

vue-resource实现数据的绑定、添加、删除

25510
来自专栏菩提树下的杨过

利用FileWatcher实现文件实时监视

FileWatcher能实现对某一目录的文件(新建,改名,内容修改,删除)的实时监视 using System; using System.IO; using ...

22680
来自专栏小特工作室

EntityFrameWork实现部分字段获取和修改(含源码)

  EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的。以下介绍的2个功能点分别是部分字段更新和获取...

23490
来自专栏木宛城主

ASP.NET那点不为人知的事(一)

我们上网时,在浏览器地址输入网址,按下回车,一张网页就呈现在我们眼前。这究竟发生了什么?对于一名优秀的Programmer来说,我想有必要一下熟悉浏览器---...

40280
来自专栏张高兴的博客

张高兴的 Windows 10 IoT 开发笔记:无线收发芯片 nRF24L01

13120
来自专栏.NET开发那点事

使用Microsoft Fakes进行单元测试(2)

接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示。 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时...

22590
来自专栏Porschev[钟慰]的专栏

asp.net生成静态页

做个生成静态页示例: 采用替换模版页的形式生成静态页 第一步:新建项目,创建一个简单模版页:TemplatePage.htm <!DOCTYPE html PU...

22660
来自专栏张高兴的博客

张高兴的 Windows 10 IoT 开发笔记:无线收发芯片 nRF24L01

31180
来自专栏菩提树下的杨过

XmlSpy / XSD 以及 验证

很早以前看过一句话:“XML就象空气”,在企业应用开发中XML是一个重要的数据交换标准。而XSD则可以用来校验XML的数据格式是否正确。 一个典型的XSD文件如...

242100

扫码关注云+社区

领取腾讯云代金券