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

目录
相关文章
|
2月前
|
Java
Byte 高位/低位简介绍(大端格式/小端格式)
Byte 高位/低位简介绍(大端格式/小端格式)
119 1
|
编解码 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...
395 0
Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
|
1月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
|
4月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
55 4
|
4月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
33 3
|
4月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
64 2
|
4月前
|
网络协议 程序员 视频直播
|
4月前
|
消息中间件 网络协议 网络安全
Python Socket编程:打造你的专属网络通道,基础篇与进阶篇一网打尽!
【7月更文挑战第26天】在网络编程领域,Python以简洁语法和强大库支持成为构建应用的首选。Socket编程为核心,实现计算机间的数据交换。
68 1