解决方案 »

  1.   

    你把数组定义成8192,不代表你每次读取的字节就是8192,这是两回事,每次读取你都要根据read方法返回值才能够确定实际读取了多少个字节。
      

  2.   

    那我应该如何确定客户端需要read多少次,从这边的控制台输出结果来看,客户端好像每次还是读取了8192但是还是没有读取完,服务器最后一次发送的字节数是6000+,但是客户端最后的读取字节数还是8192,是否在我不知道的时候,服务器的write在我没调用flush的时候又悄悄发送了数据
      

  3.   

    那我应该如何确定客户端需要read多少次,从这边的控制台输出结果来看,客户端好像每次还是读取了8192但是还是没有读取完,服务器最后一次发送的字节数是6000+,但是客户端最后的读取字节数还是8192,是否在我不知道的时候,服务器的write在我没调用flush的时候又悄悄发送了数据
    socket 要写得比较好 是个庞大的话题. 虽然有mina等开源jar可用 但依然是个庞大的话题.
    所以.. 目前你最需要的还是补足这方面知识.1.你不能确定客户端read多少次. 根据不同的 mtu 以及包的转发规则, 最后一个 8192的数据会分成多少个碎片到达终端很难确定.
    2.服务器不会神出鬼没般的给客户端随意发数据过去. (这又不是神话传说)
    3.如果你仅仅是要定关于 8192字节这么个简单的协议的话. 我建议你这么干:
     *) 服务器不管什么情况下(无论需要不需要发这么多数据) 都固定的一次发8192字节. 然后客户端while循环去读这8192
    4.如果想写得比较好我建议你这么干:
     *) 定义一个包长在前2个字节里(short) 
     *) 客户端先接这个short, 再while循环去读取这 short个字节.
      

  4.   

    一个好的文件传输协议是需要完善的实现的,你这个协议太粗糙了吧。。
    请参考FTP,TFTP协议。
    附一个TFTP协议的报文格式可以参考