我说一下看法。这两段代码如果上传有问题,应该是同一个。以客户端为例
1:len = sinReceive.read(buf);
2:System.arraycopy(buf, 0, bufData, 0, len);
我觉得对于第一句,应该搞清楚buf的状态,每一次循环buf的初始值是怎样?是不是应该清空(这一点我没看里面的程序无法肯定)?第二句受第一句的影响,错误的len值肯定会导致错误传递结果

解决方案 »

  1.   

    在客户端:
    soutUpload
    服务器端:
    sinReceive
    这两个流在每次文件传输完成后要关闭,下次重新get();
      

  2.   

    TO:  runweok(不要紧)我改成这样还是不行(客户端和服务器端都改)
    byte[] buf;
    while (true)
    {
      buf = new byte[4096];
      len = sinReceive.read(buf);
      // ...
    }TO;  heifei() 我在调用这两个方法的后面马上直接关闭了socket
    fileToSocket(clientFile, clientSocket);
    clientSocket.close();socketToFile(serverFile, serverSocket);
    serverSocket.close();
      

  3.   

    wo已经测试过你的程序了
    客户端加上:
              result = false;
            }
          }
          soutUpload.close();//这句
        }
        finally
    服务器端加上:
              System.err.println("接收文件错误!");
            }
          }
          sinReceive.close();//这句
        }
        finally
    就完全没有问题
      

  4.   

    对于
    foutReceive.write(bufData);
    你能确定每次写文件都是找文件的末尾为起点吗?
    我觉得会覆盖原内容这就难怪出错了.
      

  5.   

    TO:runweok(不要紧) 但我第一次传输文件完全没有问题啊,pdf、word、zip都可以,没有任何错误。我用UltraEdit直接比较两个文件的16进制编码,完全相同
      

  6.   

    TO:heifei() 
    大侠,还是不行啊
      

  7.   

    我来改一下,试试看:把下面的
          int len;
          while (true)
          {
            try
            {
              len = finUpload.read(buf);
              if(len < 0)
                break;
              bufData = new byte[len];
              System.arraycopy(buf, 0, bufData, 0, len);
              soutUpload.write(bufData);
              soutUpload.flush();
              result = true;
            }
            catch(IOException e)
            {
              System.err.println("读取文件错误!");
              result = false;
            }
          }
    改成:
      

  8.   

    DataOutputStream outStream = new DataOutputStream( soutUpload );
    while( true ){
       int nRead = finUpload.read( buffer );
       if( nRead == -1 )
    break;
                outStream.write( buffer, 0, nRead );
    }//接收端,把下面的:
          while (true)
          {
            try
            {
              len = sinReceive.read(buf);
              if(len < 0)
                break;
              bufData = new byte[len];
              System.arraycopy(buf, 0, bufData, 0, len);
              foutReceive.write(bufData);
              foutReceive.flush();
            }
            catch(IOException e)
            {
              System.err.println("接收文件错误!");
            }改成:
    DataInputStream Receive= new DataInputStream( sinReceive);
       while( true ) {
          int nRead = inStream.read( buffer, 0, BUF_SIZE );
          if( nRead == -1 )
    break;
          streamOutput.write( buffer, 0, nRead );
       }
      

  9.   

    DataInputStream Receive= new DataInputStream( sinReceive);
       while( true ) {
          int nRead = Receive.read( buffer, 0, BUF_SIZE );
          if( nRead == -1 )
    break;
          foutReceive.write( buffer, 0, nRead );
       }
      

  10.   

    我建议你调试一下:
    1、把byte[4096];改小点
    2、把文件传小点十几个字符吧
    3、server端system.out出来看看传递是否正确
    4、if 正确 { 查出写文件的问题 } else { 查出传的问题 }
      

  11.   

    我用JBuilder 7中的F7单步执行,就没有问题。到底怎么回事啊!快急死了!
      

  12.   

    楼上两位,还是不行:(
    我设置了一个计数器,发现服务器端接收数据的次数比客户端发送的次数要少3次(如果改变buf的大小,这个次数也会变,但总是少12k)。我改成发送文本文件,发现是丢失了前12k的字节。但客户端显示已经发送的字节数正确,而服务器接收的字节数又不对,到底是什么原因?