在服务器端将一个文件传递给客户端,客户端的接收文件的时候出现问题了
DataInputStream datain = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dataout = new DataOutputStream(new BufferedInputStream(new FileOutputStream("testfile");
int buffersize = 1024;
byte buf[]=new byte[buffersize];
while((read=datain.read(buf))!=-1)//  报错sockettimeoutexception:read time out
{
System.out.println(read);//显示接收到的字节数:1024+927
 dataout.write(buf,0,read);}
dataout.flush();服务器端传送的文件是1951k,与客户端接收到的字节数相同,但是在接收完后,再一次判断read=datain.read(buf)是否为-1时,就报错:sockettimeoutexception:read time out这是怎么回事呀

解决方案 »

  1. 刚试了一下在服务器端的
    DataInputStream datain = new DataInputStream(new BufferedInputStream(new FileInputStream("testfile));
    DataOutputStream dataout = new DataOutputStream(new BufferedInputStream(socket.getOutputStream()));
    int buffersize = 1024;
    byte buf[]=new byte[buffersize];
    while((read=datain.read(buf))!=-1)
    {
    System.out.println(read);
     dataout.write(buf,0,read);}
    dataout.flush();
    我开始在最后是没有关闭dataout和datain的,后来把这两个关闭之后 ,客户端那边就能正常接收文件了,但是我在客户端接收完文件后,再给服务器返回一个信息的时候服务器就又报错了:stream closed
    应该是因为我在服务器这边传递完文件后把dataout跟datain都 close了导致的吧,但是如果 不关客户端又不能正确 接收文件~~~~~
    哪位大侠帮忙指点一下
      

  2. 两边都flush一下应该没有问题的,不需要关闭的吧
      


  3. 两边都是flush()了的,但是在客户端还是会一直等待直到报read time out 的exception
    客户端好像就是一直读不到文件流结束的地方,一直在等待,而服务器端的dataout.close()之后 ,客户端就可以正确读到文件流的结束了
    纠结呀!!!!
      

  4. 试一下:
    服务器端不调用dataout.close(),而是调用socket.shutdownOutput()
      

  5. 先计算文件的实际大小
    首先发送文件的实际大小,比如一个int型或long型
    然后读取这个大小的字节数不就好了吗
      

  6. 应该 和 流 没有 关系吧 我的看法是
    既然 能抛出sockettimeoutexception异常 说明是java.net 包里面的类出了 问题
    所以可以试一试
    Socket.setSoTimeout 呵呵 只是个人看法你自己试一试啊
      


  7. 正解,这样就OK了,不用关闭流,3Q
      

类似问题 »