关于supersocker的数据传输中遇到的问题
最近在学socket,在使用socket时数据的传输与接口都是byte,所以文本与文件的传输只要对传过来的byte处理好就可以。
但是在supersocket上,我却花费了很长的时间。原因如下:
1、从客户端传来的byte都会处理成string,
在开始接触supersocket时发现对于文字的传输很方便,但是到了文件的传输时我才发现,传过来的byte都会转化为string,
这让我很是烦恼,在经过排查才发现StringRequestInfo为string接口会将传过来的byte转化为string
那如果我不要转化呢?经过网上学习发现要接收不同的接口,要自己而外的编写转化接口。
2.接口的传输与接收
接口的编写网上资料可以各自查找,经过学识后我用基于FixedHeaderReceiveFilter的接口写了一个byte的接口,
接口构造如下:
根据构造代码如下:(6=name(4)+len(2))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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< byte > header, byte [] bodyBuffer, int offset, int length) { return new BinaryRequestInfo(Encoding.UTF8.GetString(header.Array, header.Offset, 4), bodyBuffer.CloneRange(offset, length)); } |
写好接口后我发现,数据传不进来,又一通查找发现客户端也要按照构造来传输byte如下:
1 2 3 4 5 6 7 8 9 10 | 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的字节就解决了问题了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· 终于决定:把自己家的能源管理系统开源了!
· [.NET] 使用客户端缓存提高API性能
· .NetCore依赖注入(DI)之生命周期
· 外部H5唤起常用小程序链接规则整理
· Java生成Word文档之 XDocReport 和 Poi-tl