已经发过两个贴子求助,再简单描述下我的问题:
  自已开发的程序,C-S架构,server(多线程)用来接收日志文件,client(多网点设备)用来上传日志,在大多数的client设备上程序运行很正常,最近有一批新设备上,运行client后出现了问题,client连上后,server是线程死掉了,client报错后退出,但奇怪的是---client在发送了日志文件的一个字节后(server收到此字节),网络就不通了,需要拔插下client设备的网线水晶头,网络才能恢复......
    出现这种问题,太郁闷了,有的同事说我是黑客程序,毕竟网不通了,这台设备就不能用这程序了,只有人工传日志了
各位前辈 多指教 谁遇到过这种问题   
主要两个问题
1:问题出在server还是client??程序怎么会执行不下去 只收了一个字节  
2:收了一个字节后 网络为什么不通了??!!我的client端程序如下(节选)
FileInputStream fis = new FileInputStream(fileName);
  int data;
  while ( -1 != ( data = fis.read( ) ) )
  {
  os.write( data );
  }   
  os.flush();
  ......  
  System.out.println( "send file success!!" );
    
在一台设备上
client端设备上执行后 只从文件发送了一个字节 发送到server端后,client程序便出错退出了(server收到了此字节)  我的server端程序节选如下  
.........
System.out.println(fileName);
fos = new FileOutputStream(fileName);
int data;
while ( -1 != ( data = is.read( ) ) )
{
fos.write( data );
}
fos.flush();
......
server.myface.flyOutputStream("接收文件成功!!");
client端出错后退出 printStackTrace()错误提示如下 :
java.net:SocketException: connection reset by peer :socket write error
......................
......................

解决方案 »

  1.   

    我认为原因应该先从server端开始排查,因为“connection reset by peer”一般来说是远程主机关闭了连接。
    从你的叙述中发现,server端线程死掉了。 是server端线死掉client端菜报错的吧?排查步骤:
    1. server端仅启动一个线程,排除多线程资源竞争的问题
    2. 别直接读一个字节就开始写文件,写到ByteArrayOutputStream排除是写文件的问题看还有错吗
      

  2.   

    3楼 
      1. server端仅启动一个线程,排除多线程资源竞争的问题
      这种情况应该不存在,server不忙时,线程也会死掉
      2. 别直接读一个字节就开始写文件,写到ByteArrayOutputStream排除是写文件的问题
      ByteArrayOutputStream这个流我不太会用另外1:为什么是新设备会出现这种情况
      2:我改了下client程序 加上了 os.flush();(上面帖的程序帖错了,是修改后的 修改前没有s.flush())之后 client端现在不报错了 显示send file success!!,但server还是只写了一个字节
    后,就是走不出循环,不显示“接收文件成功”,线程死掉,网不通
     
      

  3.   

    因为你是直接写文件,虽然看到的是一个字节,但实际上可能是写了不少。那问题基本就明确是server端了。ByteArrayOutputStream实际就是byte数组,也就是说你直接往内存写。同时可以debug住看看server端运行情况。
      

  4.   

    "虽然看到的是一个字节,但实际上可能是写了不少。"
    不太明白,实际上写了不少,写到哪儿去了????不是写到文件里?
    fos.write( data ); 这句是往文件里写呀
    还有 socket的传输机制是什么 ?
    client和server不同步吗? (client传一个字节 server接收一个字节 client再传......)
      

  5.   

    另外 在server端,把fos.flush();加到循环里边如何??
      

  6.   

    socket的机制就是底层协议的机制,一般来讲不是一个字节一个直接直接传的。如果是的话,你不觉得这样效率很低吗?所以,其实在两端都会有buffer。同样的道理,
    写文件也会有buffer,不会直接往文件写,这就是为什么会有fos.flush()。给你一个通用的读流的代码:
    public static void copyStream(InputStream source, OutputStream dest,
    int bufferSize) throws IOException {
    if (bufferSize <= 0) {
    bufferSize = DEFAULT_BUFFER_SIZE;
    } int bytesToWrite;
    byte[] buffer = new byte[bufferSize]; try {
    while ((bytesToWrite = source.read(buffer)) != -1) {
    // Technically, some read(byte[]) methods may return 0 and we
    // cannot accept that as an indication of EOF.
    if (bytesToWrite == 0) {
    bytesToWrite = source.read();
    if (bytesToWrite < 0)
    break;
    dest.write(bytesToWrite);
    continue;
    }
    dest.write(buffer, 0, bytesToWrite);
    }
    } catch (IOException e) {
    throw e;
    } finally {
    try {
    dest.flush();
    } catch (IOException e) {
    // ignore
    }
    try {
    source.close();
    } catch (IOException e) {
    // ignore
    }
    try {
    dest.close();
    } catch (IOException e) {
    // ignore
    }
    }
    }
      

  7.   

    问题解决了 
    问题出在client 将client端程序改了一下 一次读100个字节 通过 
    byte[] buffer = new byte[100];
    .......
    while ( -1 != (fis.read( buffer ) ) )
      {
      os.write( buffer );
      os.flish();
      }    
    看来新设备网速快,一个字节一个字节读取不行 
      

  8.   

    3楼思路正确 谢谢
    但有个新的小问题 由于server没有修改(还是一个字节一个字节读取) 传过来的文件末尾有些文本是重复的 不知为什么