日期:2014-05-19  浏览次数:20862 次

Socket 高手请入
一个文件传输的问题

客户端     =>   发送文件请求   文件名   大小

服务器端   => 接受  

客户端   =>   开始发送

服务器端   接受到文件大小的字节后   结束写入文件   但是继续接受客户端的请求


我的问题是   万一中途客户端停止发送文件     怎么告诉服务器端呢

因为这时发过去的内容服务器端会认为是文件的一部分

因为我要一直保持SOCKET连接     不想通过断开SOCKET来   中断



------解决方案--------------------
帮顶了
------解决方案--------------------
服务器端接收后应该有一个返回信息,如果客户端收不到这个返回信息将继续发送这一端,直到收到返回信息为止!
------解决方案--------------------
你应该在发送开始的时候发送一个文件名称、长度、扩展名等信息
文件长度还没有达到的时候,服务器端就不会认为是完整的了

------解决方案--------------------
发送的时候加一个标志位
------解决方案--------------------
在数据桢前加上包头信息,包头信息可以包括桢序号,长度,识别码等,通过识别码来判断是否文件内容.比如你定义识别码100是中断等.
------解决方案--------------------
如果你不想用客户端断开的方法来判断一个文件是否完成那就的自己定一个简单的协议。

其实上面cellblue(cellblue)的办法就是比较合理的。

你在传输文件数据之前先发送一个类似http请求头的数据块,高知对方要传送文件的大小。

对方在接受完请求头之后,就按大小接受。

标识位的方法你可以用 "\0 "作为一个结束标,不过这样的方法对于大文件和效率来说,不合适。
------解决方案--------------------
我的QQ417732794,加我来探讨探讨吧
------解决方案--------------------
在每个包前面加标识....

其实最好是用XML,加上
传输类型(文件/信息/脚本/命令/内部消息)
传输对象名称(UNIQUE GUID)
对象附加信息(SOAP信息)
对象内容上下文(如文件内容相对全文的偏移量)
对象大小(对文件来说就是本次发送的块的大小)
对象内容
发送时间
服务器接收时间(中转时用)
etc...

然后加密,压缩后发出去

------解决方案--------------------
大哥你也在搞socket啊,请教个问题

结帐地点http://community.csdn.net/Expert/topic/5487/5487494.xml?temp=.2655146

目前正在作一个ftp,使用到的是ftpfactory,我们在公司内网测试一直是没问题的,可一放到客户那就不能连接上。

昨天我回家调试了一下,我直接运行程序就连不上,可是当我一步步慢点调试的时候程序能正常运行。

后来我搜索了一下了解到可能是阻塞的问题,于是也加上了Thread.Sleep
可是我发现至少要sleep(1000)程序才能有时候跑起来

------解决方案--------------------
给每个要发送的应用程序的数据加包头,是弱智的表现,加是可以加,你加了后不管你怎么样,先说接收方面吧,他不一定会一次性取到你的长度,好吧,这都好说,你可以限制好,让他每次都能收取到一定数据大小,而且你传送速度不知道要慢几百倍下来。
------解决方案--------------------
原来做设计时想用这个,结果还是用的.NET 远程处理来传东西
------解决方案--------------------
可以在一个SOCKET中创建2个线程 一个专门负责传送文件,一个负责传送接收状态
------解决方案--------------------
http://www.cnblogs.com/liuzhiwei/archive/2007/04/24/725348.html
------解决方案--------------------
http://www.cnblogs.com/liuzhiwei/archive/2007/04/24/725348.html
下他源码基本上就会明白SOCKET是怎么回事情了。