使用DataOutPut / InputStream将数据从Android应用程序发送到服务器

时间:2015-10-30 02:47:52

标签: java android servlets dataoutputstream

目前,我正在开发一个Android应用程序。我的应用程序允许用户向服务器(servlet)发送图像和一些其他详细信息。  这是从图库中拍照的代码

public void loadImagefromGallery(View view) {
    Intent galleryIntent = new Intent();
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
    galleryIntent.setType("image/*");
    startActivityForResult(Intent.createChooser(galleryIntent, "Select Picture"), CAMERA_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
        Uri uri = data.getData();

        try {
            ImageView imageView = (ImageView) findViewById(R.id.imgView);
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            ByteArrayOutputStream b = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);

            /*arr is a static byte array to store image*/
            arr = b.toByteArray(); 


            imageView.setImageBitmap(bitmap);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

之后,我使用DataOuputStream(和服务器上的DataInputStream)发送图像的字节数组和一些额外的细节(名称,电话......等等,当然从EditText中取出)   这是代码

HttpURLConnection connection = m.getConnection();
OutputStream ops = connection.getOutputStream();
DataOutputStream dops = new DataOutputStream(ops);
dops.writeInt(arr.length);

/*arr is the byte array off the image*/
dops.write(arr); 
dops.writeUTF(Name);
dops.writeUTF(Adress);
dops.writeUTF(Phone);
dops.writeUTF(Email);
dops.writeUTF(Comment);
ops.close();

和服务器端:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    try {
        DataInputStream dIn = new DataInputStream(request.getInputStream());

        int length = dIn.readInt();                   
        if(length>0) {
            byte[] input = new byte[length];
            dIn.readFully(input, 0, input.length); 
            String Name = dIn.readUTF();
            System.out.println("Name " + Name);
            String Address = dIn.readUTF();
            System.out.println("Address " + Address);
            String Phone = dIn.readUTF();
            System.out.println("Phone " + Phone);
            String Email = dIn.readUTF();
            System.out.println("Email " + Email);
            String Comment = dIn.readUTF();
            System.out.println("Comment " +  Comment);
            dIn.close();   ......

因此,问题是:在真实移动设备上运行时,数据需要8到10秒才能成功发送到服务器,但在虚拟设备上运行时只需不到1秒(虚拟设备)设备在我的笔记本电脑上使用wifi运行,同时servlet部署在PC上,直接连接到互联网。)

我认为有4个不同的原因:

1)低质量的wifi(当发送相同的图片时,有时需要15秒,但有时只需要3秒)

2)数据大小(低分辨率图片发送速度更快)

3)低质量的移动设备(我向我的朋友借用它看起来很旧......屏幕上有裂缝)

4)我使用了错误的技术,我的代码很糟糕......(我做了一些研究,看来DataOutputStream对于这种情况来说是个不错的选择)

那么......出现这个问题的主要原因是什么,我可以做些什么来改善我的应用程序性能(我使用的是正确的技术还有更好的技术)

****谢谢大家,抱歉我的英文不好

0 个答案:

没有答案