----------关于自定义文件的问题-------------

雄牛 2017-08-09 11:02:21
是这样的,我这边有一个Socket用来同步文件用的

客户端把文件发给服务器后,服务器接收并存起来

我用的方案是这样的:
客户端:
把文件名+\r\n分割符+文件修改日期+\r\n分割符+文件内容(文件流)转成byte[]这几项都转数组,再合并成一个Socket发送过去

服务器:
把接到的byte[]数组分解后再文件再存到那里.

现在的问题就出现服务器接收后分解的动作,由于socket使用的缓冲区是固定的(较大一点)
在分解的时候,我用的是先转为字符串,并分别取出文件名,修改日期,以及文件内容转成流存起来

但经常是存的文件出问题,打不开..有什么更好的方案吗
...全文
194 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
雄牛 2017-08-10
  • 打赏
  • 举报
回复
一般用什么分割符比较好,我用了三个\r\n\r
白衣如花 2017-08-10
  • 打赏
  • 举报
回复
如果你的文件里面有windows的回车符,你这个协议就惨了 这种传文件一般需要一个文件长度或者校验符,用来判断文件是否接受成功。 socket包我会这么设计 开始符---文件信息(就是你那一坨用\r\n分割的东西)长度--文件内容长度--文件信息--文件类容--终止符 开始符,终止符以及两个长度的字节数是确定的,后两个是变动的,通过两个长度来确定
xdashewan 2017-08-10
  • 打赏
  • 举报
回复
首先你这么做的前提是你的分隔符必须是唯一的,不能在你的文件内容中出现相同字符,如果有要转义,解析时再转回去。其次,你的文件内容编码要和你文件名等协议部分的编码要完全一致才能全部转字符串,再保存文件,举个例子就是当传图片你这么操作就是有问题的,所以你只能用byte去判断分割符而不能全部转字符串
X-i-n 2017-08-09
  • 打赏
  • 举报
回复
限制文件头(文件名+文件修改日期)为固定的长度,比如200Byte 或者 在你这个结构的开头补两个长度字段,表示文件头有多长,文件内容有多长

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧