为了账号安全,请及时绑定邮箱和手机立即绑定

socket中的byte消息格式设计

标签:
C#

这二天在研究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
-------------------------------

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消