zoukankan      html  css  js  c++  java
  • socket中的byte消息格式设计

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

    问题:

    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

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    儿童节扣扣讲座心得
    leetcode -- Best Time to Buy and Sell Stock II
    leetcode -- Best Time to Buy and Sell Stock
    JDeveloper中文乱码问题
    Oracle BAM数据量限制64000解决办法
    记录一条纠结了SQL语句
    OEPE创建webservice出现的一些问题
    Oracle OSB [Security:090304]Authentication Failed
    ICommand简单用法
    Oracle BAM添加企业消息源实现数据的实时监控
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1611468.html
Copyright © 2011-2022 走看看