我写了个发送文件的代码,放在本地测试是正确的,可是我放在互联网上的时候却出错了,根本发不过来
java.net.SocketException: Software caused connection abort: socket write error
报这样的错误
byte[] buf = new byte[1024];
while ((dis.read(buf)) != -1) { //每次向流里写入1024个字节
dos.write(buf, 0, buf.length);
}
在红色部分这个地方输出流写入报异常大家帮忙看看呀

解决方案 »

  1.   

    dis.read(buf)
    不一定能读满整个buf,比如整个长度不是1024的整数倍,最后一次肯定buf不满
    另外可能的io问题,任何一次读取都不能保证完全读取1024字节内容因此后面 dos.write(buf, 0, buf.length); 
    就有问题了
      byte[] buf=new byte[1024];
      int bufSize=0;
      while((bufSize=dis.read(bug))!=-1)
          dos.write(buf,0,bufSize);
      

  2.   

    谢谢 redduke1202 回复 ,我发现另外这里报错是因为我客户端再没有接收完数据的情况下 关闭了输入流,所以报这个错误,感觉关键的问题是两边没有控制好,因为我发的是多张图片。我把两边的字节 byte[] buf=new byte[1024];
    这个改变一下就能就收到部分数据,一点点。就是把发送端的这个改成8192,接收端改成568个字节读取,就能收到一部分数据,请问这样的通信怎么控制呀
      

  3.   

    制定一个简单的通讯协议吧
    数据包=数据长度(int)+有效数据/*
     * 数据发送
     */
    public static void writeBytes(java.io.DataOutputStream dos,byte[] bytes) throws IOException
    {
    dos.writeInt(bytes.length);
    dos.write(bytes);
    }
    /*
     * 数据接收
     */
    public byte[] readBytes(java.io.DataInputStream dis) throws IOException
    {
    byte[] bytes=new byte[dis.readInt()];
    dis.readFully(bytes);
    return bytes;
    }
      

  4.   

    我是这样子做的,可是感觉发送的图片不对劲,显示不了,大小都是正确的,可是不认识发过来的东西,我用in.readLine()读出来的图片的东西是一些方块的乱码 ,不知道是怎么回事呀
      

  5.   

    现在解决了一个问题,就是我在接收端接收一张图片后发了一个消息给发送端,然后接着发送第二张图片,因为我要发送队长图片,放在一个for循环里面发的,在Input接收到这个字符串后再开始发送第二张图片,结果就能发过来了。以前是没有这个控制,发送端只管发,接收端只管接,接收到文件大小就跳出while(in.read)这样子,然后继续接下一张,这样不行,不知道为什么。
    上面问题是解决了,可是现在有新问题了。
    就是我客户端第一次去连接的时候发送正确,然后关掉了客户端,服务器端一直监听。第二次连接的时候第二张图片就发送失败了,不知道什么原因了。我在第一次连接发送完后,把所有的东西都关掉了,除了ServerSocket。
      

  6.   

    哎,人烟稀少呀,最后提问,就是我用的for()循环发的多张图片,接收端再接收完一张图片都发个消息给发送端,发送端收到这个接收完毕的标志消息后发第二张图片,调试的时候完全Ok,可是运行就出错。有时候第一次连接也ok,我把接收端关了重新连接就出错,发送端其他的都关掉,只是ServerSocket一直监听,不知道为什么。希望有人能帮帮忙