2013-08-16 42 views
0

我试图修改我最初只能发送字符串的android代码。任务是让它可以传输图片。我知道有很多不同的方法来实现这一点。但我试过,真的不知道为什么我的照片无法发送,虽然连接没有问题。 有谁能告诉我?我会很感激它。 我只是一个初学者,请忘记我可怜的编程技巧。Android:如何通过套接字正确发送图片

这里是服务器的下面

private Runnable socket_server = new Runnable(){ 
    public void run(){ 
     handler.post(new Runnable() { 
      public void run() { 
       test.setText("Listening...." + getMyIp()); 

      } 
     }); 
     try{ 
      serverSocket = new ServerSocket(1234); 

      while (true) { 
       Socket client = serverSocket.accept(); 

       handler.post(new Runnable() { 
        public void run() { 
         test.setText("Connected."); 
        } 
       }); 
       try { 
        File myFile = new File ("/sdcard/DCIM/img2.jpg"); 
         byte [] mybytearray = new byte [(int)myFile.length()]; 
         FileInputStream fis = new FileInputStream(myFile); 
         BufferedInputStream bis = new BufferedInputStream(fis); 
         bis.read(mybytearray,0,mybytearray.length); 
         OutputStream os = client.getOutputStream(); 
         os.write(mybytearray,0,mybytearray.length); 
         os.flush(); 
         client.close(); 
        test.setText("Received."); 

       } catch (Exception e) { 
        handler.post(new Runnable() { 
         public void run() { 
          test.setText("Sending erro"); 
         } 
        }); 
       } 
      } 
     }catch(IOException e){ 
      handler.post(new Runnable() { 
       public void run() { 
        test.setText("Fail to buitl the socket"); 
       } 
      }); 
     } 
    } 
}; 

主要部分,这里是客户

new Thread() 
      { 
       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        InetAddress serverAddr = null; 
        SocketAddress sc_add = null; 
        Socket socket = null; 

        try 
        { 
         serverAddr = InetAddress.getByName("192.168.1.105"); 
         sc_add= new InetSocketAddress(serverAddr,1234); 
         socket = new Socket(); 
         socket.connect(sc_add,2000); 

         File myFile = new File("/sdcard/DCIM/img2.jpg"); 
         InputStream fis = new FileInputStream("/sdcard/DCIM/img2.jpg"); 
         OutputStream outputStream = socket.getOutputStream(); 

         byte [] buffer = new byte[(int)myFile.length()]; 

         int temp = 0 ; 
         while((temp = fis.read(buffer)) != -1){ 
          outputStream.write(buffer, 0, temp); 
         } 
         outputStream.flush(); 
         socket.close(); 


       } catch (UnknownHostException e) { 

        //TextView01.setText("InetAddress fail"); 

       } catch (SocketException e) { 

        //TextView01.setText("fail to develop socket"); 

       } catch(IOException e) { 

        //TextView01.setText("fail to sending"); 

       } 
       } 

      }.start(); 

回答

2

这是你的问题的一部分:

byte [] mybytearray = new byte [(int)myFile.length()]; 
// ... 
bis.read(mybytearray,0,mybytearray.length); 
OutputStream os = client.getOutputStream(); 
os.write(mybytearray,0,mybytearray.length); // <- This one. 

我写这个了一次,这里:Working unbuffered streams

问题是,这段代码假设缓冲区完全是 满了,这不一定是这种情况。为 InputStream.read(字节[],INT,INT)文档状态:

读取从输入流数据的高达 len个字节成 字节的数组。试图读取尽可能多的len字节,但可能会读取较小的 数字。实际读取的字节数作为整数返回为 。 [...]

因此,缓冲区不保证是满的。当我们使用OutputStream.write(byte[], int, int)-方法将读取字节写入输出流时,此 成为问题。它 文档读取:

写入[恰好]从指定的字节数组起始于 len个字节偏移量off此输出流。 [...]

这里是一个工作实现:

byte buffer[] = new byte[1024]; 
int read_count = 0; 
while ((read_count = input.read(buffer, 0, buffer.length)) != -1) { 
    output.write(buffer, 0, read_count); // Now writes the correct amount of bytes 
} 

而且,缓冲不应该是一样大的整个文件,因为文件中的数据块传输更加高效。看到这个老问题的详细解释:How do you determine the ideal buffer size when using FileInputStream?

+0

真的谢谢你的明确答案。但我试过你显示的方式,似乎仍然有一些问题与我的程序... –

+1

更新您的问题与更多的信息 –