socket中的byte消息格式设计
时间:2022-04-23
本文章向大家介绍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
- 使用PowerShell简化我的工作
- 几个提高工作效率的Python内置小工具
- J2EE相关总结
- (53) 剖析Collections - 算法 / 计算机程序的思维逻辑
- Flask使用Blueprint进行多模块应用的编写
- 优雅的在终端中编写Python
- Eclipse相关问题
- (54) 剖析Collections - 设计模式 / 计算机程序的思维逻辑
- Django 博客教程(三):创建应用和编写数据库模型
- package-info.java文件详解
- 在Spring下集成ActiveMQ
- Java中只有按值传递,没有按引用传递!
- 我是如何使用Python来自动化我的婚礼的
- left join 过滤条件写在on后面和写在where 后面的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Hive-1.2.1_03_DDL操作 1.1. Create Database1.2. Drop Database1.3. Use Database2.1. Cre
- Hive-1.2.1_04_DML操作 5.1. Join8.1. 使用案例8.2. Transform实现
- Hive-1.2.1_05_案例操作
- Mysql字符编码利用技巧
- Hive-1.2.1_06_累计报表查询
- Flume-1.8.0_部署与常用案例
- GlassFish 目录穿越漏洞测试过程
- 安装CDH7.1.1
- GIT-SHELL 沙盒绕过(CVE-2017-8386)
- Azkaban-2.5.0-部署与常见案例
- 无字母数字webshell之提高篇
- Sqoop-1.4.7-部署与常见案例
- Hbase-2.0.0_01_安装部署
- 前端黑魔法之远程控制地址栏
- 攻击LNMP架构Web应用的几个小Tricks