一个文件传输的问题客户端  => 发送文件请求 文件名 大小服务器端 =>接受 客户端 => 开始发送服务器端 接受到文件大小的字节后 结束写入文件 但是继续接受客户端的请求我的问题是 万一中途客户端停止发送文件  怎么告诉服务器端呢因为这时发过去的内容服务器端会认为是文件的一部分因为我要一直保持SOCKET连接  不想通过断开SOCKET来 中断

解决方案 »

  1.   

    如果你不想用客户端断开的方法来判断一个文件是否完成那就的自己定一个简单的协议。其实上面cellblue(cellblue)的办法就是比较合理的。你在传输文件数据之前先发送一个类似http请求头的数据块,高知对方要传送文件的大小。对方在接受完请求头之后,就按大小接受。标识位的方法你可以用 "\0"作为一个结束标,不过这样的方法对于大文件和效率来说,不合适。
      

  2.   

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

  3.   

    大哥你也在搞socket啊,请教个问题结帐地点http://community.csdn.net/Expert/topic/5487/5487494.xml?temp=.2655146目前正在作一个ftp,使用到的是ftpfactory,我们在公司内网测试一直是没问题的,可一放到客户那就不能连接上。昨天我回家调试了一下,我直接运行程序就连不上,可是当我一步步慢点调试的时候程序能正常运行。后来我搜索了一下了解到可能是阻塞的问题,于是也加上了Thread.Sleep
    可是我发现至少要sleep(1000)程序才能有时候跑起来
      

  4.   

    原来做设计时想用这个,结果还是用的.NET 远程处理来传东西
      

  5.   

    不知道各位说的包是什么意思啊我只是用SOCKET.SEND(BYTES[]) 啊哪有什么包啊我在传文件前先发文件名 和大小啊问题是万一客户端按了取消 然后又传另一个文件
    怎么才能让服务器端识别\n 识别也不可靠啊 万一传的文件里有\n呢
      

  6.   

    mygod_good(菜鸟之非常菜) 你的普通话好烂。没看懂你说什么
    楼主可以这样你用一个连接保持与服务器之间的长久连接。每传一个文件的时候,就新创建个socket连接,与服务器通讯。如果客户取消,就是socket.Close就可以了。服务器就可以知道对方取消了。
      

  7.   

    楼上的,哈哈,终于发现一个懂SOCKET的了。
      

  8.   

    Moon1(静静的黎明) 那一般的FTP 都是这样的吗?
      

  9.   

    恩ftp 就是这样。
     
    一般来说,常用21端口来保持和客户的连接用另一个端口连接来跟用户交互文件。to mygod_good(菜鸟之非常菜) (
    我也不是很懂 : ) 说过了头的话,对不住了
      

  10.   

    恩ftp 就是这样。
     
    一般来说,常用21端口来保持和客户的连接用另一个端口连接来跟用户交互文件。
    /////////////////////////////////////////////////////////////////////////
    楼上,你这样认为,那就变成不懂了哦。一个端口可以建立多个连接,只要保持第一个连接作为基础通信就行了。其他连接可以做其他的事情。
      

  11.   

    刚看了RFC959 算是基本明白了不过最后还有个问题  第一个连接登陆以后第二个连接 用什么方法验证用户呢?
      

  12.   

    可以在一个SOCKET中创建2个线程 一个专门负责传送文件,一个负责传送接收状态
      

  13.   

    http://www.cnblogs.com/liuzhiwei/archive/2007/04/24/725348.html
      

  14.   

    http://www.cnblogs.com/liuzhiwei/archive/2007/04/24/725348.html
    下他源码基本上就会明白SOCKET是怎么回事情了。
      

  15.   

    一个SOCKET中创建2个线程 ?
    怎么可能?
      

  16.   

    恩ftp 就是这样。
     
    一般来说,常用21端口来保持和客户的连接用另一个端口连接来跟用户交互文件。
    /////////////////////////////////////////////////////////////////////////
    楼上,你这样认为,那就变成不懂了哦。一个端口可以建立多个连接,只要保持第一个连接作为基础通信就行了。其他连接可以做其他的事情。
    //////////////////////////////////
    你说的和我说的有什么区别么,我好象没有那句话在误导楼主说:一个端口不可以建多个连接吧。
    你的语文哎。
      

  17.   

    frankla(frank) ( ) 信誉:100    Blog   加为好友  2007-04-24 15:32:33  得分: 0  
     
     
       刚看了RFC959 算是基本明白了不过最后还有个问题  第一个连接登陆以后第二个连接 用什么方法验证用户呢?
    ////////////////////////////////不知道你是不是在写一个ftp协议的实现?如果是这样,比较复杂,一般说是两方便协商, 客户要传文件的时候会告诉服务器,“我又打开了一个端口,你连过来吧。” 这个协商是通过第一个连接传递的。所以,我觉得验证不会出什么问题如果想谨慎点,可以在第一连接后,服务器分配给客户一个GuidID,客户发起第二个连接的时候,拿这个凭证和服务器上的对应(session的原理)。
      
     
      

  18.   

    刚看了FTP协议 说到要用两个SOCKET 一个用来CONTROL 一个DATA SOCKET