在套接字上发送和接收文件

时间:2014-06-10 20:48:28

标签: java android sockets network-programming

我正在从java服务器向远程Android客户端发送文件。我使用outputstream写字节。在读取这些字节时,read()方法会在流结束后继续尝试读取字节。如果我在服务器端关闭输出流,则读取操作工作罚款。但是我必须再次在同一个套接字上写文件,以便能解决输出流的任何解决方案吗?

注意:我的代码对于共享单个文件非常有用

编写文件的代码

   public static void writefile(String IP, String filepath, int port, OutputStream out ) throws IOException {

        ByteFileConversion bfc = new ByteFileConversion();
        byte[] file = bfc.FileToByteConversion(filepath);

        out.write(file, 0, file.length);
        out.close(); // i donot want to close this and how can I tell reading side that stream is ended.


        System.out.println("WRITTEN");

    }

我在Android上阅读文件:

     public Bitmap fileReceived(InputStream is)
 { 

Bitmap bitmap = null;  
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = "a.png";
String imageInSD = baseDir + File.separator + fileName; 
//  System.out.println(imageInSD);
if (is!= null) {
    FileOutputStream fos = null;
    OutputStream bos = null;
    try {

        bos = new FileOutputStream(imageInSD);

        byte[] aByte = new byte[1024]; 
        int bytesRead;  
         int index = 0;
         DataInputStream dis = new DataInputStream(is);



        while ( (bytesRead = is.read(aByte)) >0   ) {
             index =  bytesRead +index;
            bos.write(aByte, 0, bytesRead); 

          //  index = index+ bytesRead;

       System.out.println("Loop"+aByte+ "    byte read are "+bytesRead+ "whree  index ="+ index); 

        }  
        bos.flush();
       bos.close();

    Log.i("IMSERVICE", "out of loop");     
        java.io.FileInputStream in = new FileInputStream(imageInSD);
   bitmap = BitmapFactory.decodeStream(in);
      bitmap = BitmapFactory.decodeFile(imageInSD);

Log.i("IMSERVICE", "saved");
   //   if (bitmap != null) 
 //       System.out.println("bitmap is    "+ bitmap.toString());

    } catch (IOException ex) {    
        // Do exception handling      
 //     Log.i("IMSERVICE", "exception ");
        System.out.println("ex");
    }
}

return bitmap;
}

其实我想重置套接字连接

提前致谢

2 个答案:

答案 0 :(得分:3)

你需要:

  1. 在文件前发送文件的长度。您可以使用DataOutputStream.writeLong(),并在接收方使用DataInputStream.readLong()
  2. 在接收器处准确读取流中的那么多字节:

    while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))) > 0)
    {
        out.write(buffer, 0, count);
        total += count;
    }
    
  3. E&安培; OE

      

    其实我想重置套接字连接

    实际上你不想做任何这样的事情。

答案 1 :(得分:-1)

  

如果我不关闭输出流,则另一侧的读取操作会继续读取

这是因为客户端套接字InputStream仍在等待服务器发送一些数据包,从而阻塞主线程。

解决方案:

您可以将每个发送(OutputStream)和读取(InputStream)数据包从套接字放入线程,以防止在读取和发送时阻塞主线程。

创建一个读取InputStream的线程和另一个OutputStream

的线程

旁注:

请不要尝试关闭outputStream,因为文档说法不能重新打开它:

关闭返回的OutputStream将关闭相关的套接字。

close的一般合约是关闭输出流。封闭流无法执行输出操作,无法重新打开。