我用DataInputStream和DataOutputStream对Socket流进行封装的,通过日志输出,发现服务端执行到out.writeUTF(str),客户端执行到in.readUTF(),但是却读不到数据,客户端阻塞,不继续执行,而且错误是一定概率才出现的,谁知道可能原因是什么,各位有经验的都来说说啊,有没有谁碰到类似的错误,大约运行10次会出现一次阻塞,其余的都正常,头疼啊,找不到原因,求救!!!!!!!!!

解决方案 »

  1.   

    文件输出流当然是关闭了,因为一个文件写完了,自然要关闭流,socket流是没有关闭的
      

  2.   

    这个基本上是 发送缓冲区 导致的问题,Java为了提升网络IO性能,建立了数据发送缓存区。你需要在:
      out.writeUTF(str);
    之后,增加:
      out.flush();保证数据会从缓冲区中立即发送出去。
      

  3.   

    flush()过了,还是不行~
    顺便问下,Socket传输有没有可能会丢失字节??
      

  4.   

    TCP是可靠传输。当然也会发生信息错误,但概率很低。楼主的问题,只能继续检查代码之间的逻辑是否正常。
    又看了下你说的意思“服务端执行到out.writeUTF(str)”,意思是这句话都没执行完?
    这一般意味着发送缓冲区已满且无法发送给对方了,
    进一步意味着对方的接收缓冲区已满无法继续接收,
    再进一步意味着对方可能没有及时读取流中的数据。
      

  5.   

    out.writeUTF(str)已经执行到了,in.readUTF()出现阻塞,缓冲区也都读完了,因为这之前是进行传输文件,而且那个文件已经生成了
    而且这个错误是一定概率才出现的,这让我非常头疼,感觉是不是Socket本身的问题,不是逻辑上的问题
      

  6.   

    “out.writeUTF(str)已经执行到了” 是什么意思?是已经执行过去了,还是停在这句话。Socket本身不会有问题的,大家都在用,哪可能突然出个啥问题。
      

  7.   

    发文件的时候没有控制编码,就是用write(byte[] buf)