socket中的byte消息格式设计

简介: 这二天在研究webabcd的socket多人聊天室,想尝试增加一些功能,比如:允许用户除发送文字外,还能发送图片或文件。 问题: socket发送数据时,只能发送byte[]数组,且无法附带其它用户自定义参数,服务端如何知道用户发过来的是文字还是图片或是文件呢,所以只能在byte数组上动脑筋了. silverlight中,用户选择的图片或文件,都能变成FileStream,近而变成byte数组,初步想法是在数组前后加一些标记之类,比如最开始几个字节是"img,txt,file"中对应的一个,这样服务端接收到以后,通过拆解分析就能知道用户发过来的何种格式。

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

目录
相关文章
|
编解码 Python
Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
373 0
Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
|
10月前
|
Java
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
95 0
|
2月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
27 0
|
2月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
37 0
|
存储 Java 计算机视觉
java 之byte
当涉及到处理数据时,Java 提供了多种数据类型,其中包括 `byte` 类型。在本文中,我们将深入探讨 Java 中的 `byte` 数据类型,了解它的特点、用途以及在编程中的实际应用。
|
Java
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
79 0
|
存储 Java
[java 基础知识] byte int 互转
[java 基础知识] byte int 互转
121 0
|
Dubbo 应用服务中间件
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
166 0