当前位置: 代码迷 >> C# >> socket接收文件有关问题,文件的发送方发送格式固定,没有文件长度。小弟我应该怎么接收文件
  详细解决方案

socket接收文件有关问题,文件的发送方发送格式固定,没有文件长度。小弟我应该怎么接收文件

热度:394   发布时间:2016-05-05 05:13:51.0
socket接收文件问题,文件的发送方发送格式固定,没有文件长度。我应该如何接收文件?
最近做一个socket通信的,现在已经有的TCP服务器端能够发送文件,但是发送文件的格式固定,只有文件名与文件数据。现在我应该如何接收这个文件,如何while循环去receive的话会阻塞,用异步beginread的话就会无限循环,我需要接收完数据就退出,所以这个办法也不行。我socket开发也有一段时间,自定义协议我是懂的,但是这次文件发送方无法提供文件长度,该如何接收?求大神指教。
------解决思路----------------------
可以参考一下 http://msdn.microsoft.com/en-us/library/6y0e13d3(v=vs.110).aspx

   while (true) { //因为不知道文件内容的长度,所以要用 while循环,不断的接取数据

                    bytes = new byte[1024];

                    int bytesRec = handler.Receive(bytes);

                    data += Encoding.ASCII.GetString(bytes,0,bytesRec); 
                    if (data.IndexOf("<EOF>") > -1) { // 接收完毕,跳出

                        break;

                    }

                }

------解决思路----------------------
引用:
发送方发的格式我是知道的,只有文件名和文件数据,具体协议格式我知道,没有文件长度。我之前编了一个异步的,之所以无限循环就是因为没有办法判断结束条件,当发送方发送第二个文件时,我检测到第二个文件头我才能确定第一个文件接收完整。


唉!你连发送数据结束时用什么来表示都说不出来。是不是对方跟你一样懒得跟其它相关编程者真正写明白必须的问题啊?
------解决思路----------------------
让发送方提供一个接收文件的demo给你,只知道"格式"其实不算是完整的协议
如果他们自己随便造的协议,自己都没想好该怎么接收的话,告诉他们修改协议
------解决思路----------------------
你自己都说了“当发送方发送第二个文件时,我检测到第二个文件头我才能确定....”,请问这是对方给你的白纸黑字的写出来的通讯规范吗?

如果是,那么你就只能这样编程。如果你一个劲抱怨说你是这样瞎猜的,那么你为什么不要对方给你白纸黑字地写上一条规范、明白告知“如何判断文件结束?”的问题?
------解决思路----------------------
你要求对方发送文件,对方就胡乱的把文件名和文件内容发过来,这根本不能称为"协议"
估计对方也根本没做过通信

而且你还提到了是通过串口发送的
通过串口发送,就必须在协议里指定校验(sum校验,CRC校验等)
因为串口数据不保证准确性,需要自己加校验判断准确性(而TCP协议里底层已经封装好了校验的办法,校验不通过包就直接被丢弃了,不用你自己操心数据是否可能有错误)
比如串口线附近有个电机(强电磁干扰),很可能你收到的数据全部是0xFF这种东西
  相关解决方案