【问题标题】:Not able to transfer image everytime through socket Android每次都无法通过套接字 Android 传输图像
【发布时间】:2013-11-18 12:09:48
【问题描述】:

我需要开发一个应用程序来将图像从 android 连续传输到 android,这应该在客户端作为视频接收..我有两个应用程序,一个(服务器)将通过 wifi 连接的套接字发送文件和其他应该客户端应该接收发送的图像...目前只是将其保存在客户端的一个位置...能够正确接收文件...但问题是无法发送所有文件始终正确... 意味着有时图像文件将被传输,有时我将无法接收,当我无法接收时,我会遇到异常 : java.io.UTFDataFormatException: ...而且接收端没有写入和保存文件...

如果无法连续接收图像...我可以认为代码中存在一些问题..但有时可以传输它..有时无法传输...无法传输弄清楚问题是什么......请提供任何指导

错误是:

11-18 10:38:17.351: W/System.err(1001): java.io.UTFDataFormatException: 错误的第二个或第三个字节在 2 11-18 10:38:17.359: W/System.err(1001): 在 java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:53) 11-18 10:38:17.359: W/System.err(1001): 在 java.io.DataInputStream.decodeUTF(DataInputStream.java:444) 11-18 10:38:17.359: W/System.err(1001): 在 java.io.DataInputStream.decodeUTF(DataInputStream.java:438) 11-18 10:38:17.359: W/System.err(1001): 在 java.io.DataInputStream.readUTF(DataInputStream.java:433)

当我得到这个异常时文件没有保存..

我通过捕获图像并保存和发送...以及压缩图像和发送...在这些场景中测试了许多场景... .

发件人代码: File myFile = new File(sdCard+"/image/image.jpg");
byte[] mybytearray = new byte[(int) myFile.length()];

           FileInputStream fis = new FileInputStream(myFile);  
           BufferedInputStream bis = new BufferedInputStream(fis);  
           //bis.read(mybytearray, 0, mybytearray.length);  

           DataInputStream dis = new DataInputStream(bis);     
           dis.readFully(mybytearray, 0, mybytearray.length);  

           OutputStream os = socket.getOutputStream();  
           tv.setText("Send file name size to server");

           //Sending file name,file size and to the server  
           DataOutputStream dos = new DataOutputStream(os);     
           dos.writeUTF(myFile.getName());     
           dos.writeLong(mybytearray.length);     
           dos.write(mybytearray, 0, mybytearray.length);     
           dos.flush();  
           socket.close();
           tv.setText("Socket Close");

           tv.setText("Sent");

接收方代码: 文件目录 = 新文件 (sdCard.getAbsolutePath() + "/dir1/dir2"); dir.mkdirs();

            String fileName = clientData.readUTF();   
            File file = new File(dir,fileName);

            OutputStream output = new FileOutputStream(file);     
            long size = clientData.readLong();     
            byte[] buffer = new byte[1024];     
            while (size > 0 && (bytesRead = clientData.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)     
            {     
                output.write(buffer, 0, bytesRead);     
                size -= bytesRead; 
                System.out.println("Writing");
            }  
             // status.setText("Received");
            // Closing the FileOutputStream handle  
            output.close();
            s.close();

感谢和问候, Divya.K

【问题讨论】:

  • 除了你的错误,如果你不断地打开和关闭套接字,你将无法以任何理智的方式流式传输视频。延迟将是无望的。
  • Hiii Martin James,谢谢您的回复..除此之外,问题的解决方案是通过套接字将视频从 android 流式传输到 android..coz 以前我曾尝试使用 mediarecorder 属性已经发布在stackoverflow.com/questions/18886981/… ..最后我能够保存录制的视频文件..但我无法播放视频..视频已编码..它能够使用 MX 播放器等 3rd 方媒体播放器播放..但不在默认媒体播放器中。所以我开始像这样实现
  • 我已经尝试了很多我在谷歌中找到的方法,但没有合适的解决方案..所以请你指导我如何通过 wifi 通过套接字将在线视频从 android 流式传输到 android...任何想法..而且我没有尝试通过创建 RTP 数据包来实现像 Spydroid IP 摄像头一样。我需要在没有任何中间服务器的情况下实现..只需通过套接字..直接流...所以我该如何继续实现...跨度>

标签: android sockets multimedia


【解决方案1】:

我被困在这件事上,我结合了几天的搜索并达到了这个......试试看是否适合你..

  Bitmap myBitmap = null;
        try {
            File imgFile = new File(imgPath);
            if (imgFile.exists()) {

                File image = new File(imgPath, "imagename.jpg");
                BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                myBitmap = BitmapFactory.decodeFile(image.getAbsolutePath(),bmOptions);
                //myBitmap = Bitmap.createScaledBitmap(bitmap,parent.getWidth(),parent.getHeight(),true); //uncomment this if you want to scale the image
                //imageView.setImageBitmap(bitmap);//to set bitmap to image view
            }

            Socket sock = new Socket("192.168.1.1", 80);//ip adress and port number
                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
            if (myBitmap != null) {
                myBitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
            }
            byte[] bitmapdata = bos.toByteArray();
            ByteArrayInputStream bs = new ByteArrayInputStream(bitmapdata);


            BufferedInputStream bis = new BufferedInputStream(bs);
            bis.read(bitmapdata, 0, bitmapdata.length);
            OutputStream os = sock.getOutputStream();
            System.out.println("Sending...");
            os.write(bitmapdata, 0, bitmapdata.length);
            os.flush();
            sock.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2014-08-26
    • 2012-07-12
    • 2021-06-09
    • 2012-09-07
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多