supersocket缓冲区_关于supersocker的数据传输中遇到的问题
最近在学socket,在使用socket时数据的传输与接口都是byte,所以文本与文件的传输只要对传过来的byte处理好就可以。
但是在supersocket上,我却花费了很长的时间。原因如下:
1、从客户端传来的byte都会处理成string,
在开始接触supersocket时发现对于文字的传输很方便,但是到了文件的传输时我才发现,传过来的byte都会转化为string,
这让我很是烦恼,在经过排查才发现StringRequestInfo为string接口会将传过来的byte转化为string
那如果我不要转化呢?经过网上学习发现要接收不同的接口,要自己而外的编写转化接口。
2.接口的传输与接收
接口的编写网上资料可以各自查找,经过学识后我用基于FixedHeaderReceiveFilter的接口写了一个byte的接口,
接口构造如下:
根据构造代码如下:(6=name(4)+len(2))
public ByteReceiveFilter()
: base(6)
{
}
protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
{
return (int)header[offset + 4] * 256 + (int)header[offset + 5];
}
protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment header, byte[] bodyBuffer, int offset, int length)
{
return new BinaryRequestInfo(Encoding.UTF8.GetString(header.Array, header.Offset, 4), bodyBuffer.CloneRange(offset, length));
}
写好接口后我发现,数据传不进来,又一通查找发现客户端也要按照构造来传输byte如下:
byte[] buffer = Encoding.UTF8.GetBytes(msg);
byte[] senddata = new byte[buffer.Length + 6];
senddata[0] = 0;
senddata[1] = 0;
senddata[2] = 0;
senddata[3] = 0;
senddata[4] = (byte)(buffer.Length / 256);
senddata[5] = (byte)(buffer.Length % 256);
Buffer.BlockCopy(buffer, 0, senddata, 6, buffer.Length);
client.Send(byteing(buffer));
0-3为传名称(可空),4-5为传输数据包的大少(必填),后面为数据包
3.在弄好接口发现当传输512以下的文件时没错,但是过了512后发现文件的传输会报错
又经过一轮查找,因为终端每次发送文件的最大缓冲区是512字节,所以每次接收也是定义为512字节,所以超过512后要分开传输,然而还是没有解决问题,
然后在逐步的调试中才发现,分成512每包后,但在发送时加上头的6个字段就超过了512的字节,所以将包分成506的字节就解决了问题了。
supersocket缓冲区_关于supersocker的数据传输中遇到的问题相关推荐
- supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?...
Client端代码: public class Client implements Runnable { private String ip;// 连接IP private int port;// 连 ...
- php mate,textmate 命令行_使用PHP在TextMate中创建命令
textmate 命令行_使用PHP在TextMate中创建命令 textmate 命令行_使用PHP在TextMate中创建命令 textmate 命令行 TextMate is the best ...
- 学习笔记_关于switch在whlie中无限循环的解决办法_C语言
学习笔记_关于switch在whlie中无限循环的解决办法_C语言 今天在做作业的时候突然发现一个问题 #include<stdio.h> int main() {int a;while( ...
- 如何提取edit control中输入的数据_如何在Power Query中提取数据——列表篇(1)
表名为列表,第一步骤名称为源 (一)从头开始提取 1. 获取列表第一个 List.First(list as list, optionaldefaultValue as any)as any 返回列表 ...
- 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...
系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...
- mysql job_MySQL数据传输中dtle 之 job 实现简析-爱可生
原标题:MySQL数据传输中dtle 之 job 实现简析-爱可生 作者:吕海龙 爱可生 DTLE 团队成员,负责 DTLE 开发 ,日常问题处理以及相关问题的排查. 本文来源:原创投稿 *爱可生开源 ...
- ux设计中的各种地图_如何在UX设计中使用颜色
ux设计中的各种地图 Color is the mother tongue of the subconscious. 颜色是潜意识的母语. - Carl Jung -荣格 Color has more ...
- 探索性数据分析入门_入门指南:R中的探索性数据分析
探索性数据分析入门 When I started on my journey to learn data science, I read through multiple articles that ...
- 基于边缘计算的实时绩效_基于绩效的营销中的三大错误
基于边缘计算的实时绩效 We've gone through 20% of the 21st century. It's safe to say digitalization isn't a new ...
最新文章
- python3 多线程_图解|为什么 Python 多线程无法利用多核
- java获取下一季末_java取当前周期、月初至月末、季度初至季度末日期。
- linux oraclerman自动备份,Linux平台下的Oracle自动备份案例(使用RMAN)
- 4.12Python数据处理篇之Matplotlib系列(十二)---绘图风格的介绍
- python安装cv2模块_pythonimportcv2importError:DLLloadfailed:找不到指定模块
- devserver配置_vue.config.js的配置
- 基于序贯重要性重采样的粒子滤波and(RBPF)
- SpringBoot 2 快速整合 | Hibernate Validator 数据校验
- stm32实验报告心得体会_STM32实验报告
- 接入微信分享过程的喜和泪
- 100套高质量的免费 PSD 界面设计素材【系列一】
- visual studio 容器工具首次加载太慢 vsdbg\vs2017u5 exists, deleting 的解决方案
- Scrapy 1.4 文档 02 安装指南
- python not_刚接触Python,python中not in怎么解释?求解释一下?
- iOS系统下常用的三方应用URL Scheme值
- 捕获数据包(Wireshark)
- FMRI及NMR简介
- 7 进度指示器(LinearProgressIndicator、CircularProgressIndicator)
- Vue install 失败的一些解决办法
- 镜头矫正 棋盘矫正_矫正强迫,而不是症状
热门文章
- ajax提交表单序列化(serialize())数据
- SharePoint 2010遍历文档库中所有的文件,文件夹
- Ubuntu18.04忘记密码解决
- Linux之fd与dup2复制fd用法
- Android常见音频通路(十四)
- Ubuntu18.04编译Android源码openssl版本过高
- Android Camera数据流分析全程记录(overlay方式二)
- Android BlueDroid(三):BlueDroid蓝牙开启过程enable
- mysql之desc 与asc
- 视频编解码(十三):list_for_each_entry列表总结