Android客户端到.NET服务器端导致管道损坏

时间:2013-08-27 07:19:34

标签: android http networking client-server broken-pipe

客户端代码在android中。 .NET中的服务器端代码。我在错误中得到了一个破碎的管道。在这方面可以做些什么?

客户端代码 -

MainActivity.java

package com.example.imageupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //loads the main screen.
        setContentView(R.layout.activity_main);

        // enables network calls in the UI thread.
        if( Build.VERSION.SDK_INT >= 9){
               StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
               StrictMode.setThreadPolicy(policy); 
        }

        FileInputStream fstrm;
        try {
            // reading the file from the device.
            fstrm                   =   new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"android.jpg");
            // Set your server page URL (and the file title/description)
            File file               =   new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"android.jpg");
            // For getting the file length.
            long length             =   file.length();

            HttpFileUpload hfu      =   new HttpFileUpload("http://10.0.2.2:49246/WebSite1", "title","description",length,fstrm);

            //Network operations shouldn't be done in the UI thread.
            Thread myThread         =   new Thread(hfu);
            myThread.start();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } 
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

HttpFileUpload.java

package com.example.imageupload;

import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.util.Log;

public class HttpFileUpload implements Runnable{
        URL connectURL;
        String responseString;
        String Title;
        String Description;
        Long mLength;
        byte[] dataToServer;
        FileInputStream fileInputStream = null;

        HttpFileUpload(String urlString, String vTitle, String vDesc,long length,FileInputStream fstrm){
                try{
                        connectURL      =   new URL(urlString);
                        Title           =   vTitle;
                        Description     =   vDesc;
                        mLength         =   length;
                        fileInputStream =   fstrm;
                        Sending();
                }catch(Exception ex){
                    Log.i("HttpFileUpload","URL Malformatted");
                }
        }

        void Sending(){

                String iFileName    =   "android.jpg";
                String lineEnd      =   "\r\n";
                String twoHyphens   =   "--";
                String boundary     =   "*****";
                String Tag          =   "fSnd";
                try
                {
                        Log.e(Tag,"Starting Http File Sending to URL");

                        // Open a HTTP connection to the URL
                        HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection();

                        // Allow Inputs
                        conn.setDoInput(true);

                        // Allow Outputs
                        conn.setDoOutput(true); //Custom changed.

                        // Don't use a cached copy.
                        conn.setUseCaches(false);

                        // Use a post method.
                        conn.setRequestMethod("POST");

                        conn.setRequestProperty("connection", "Keep-Alive");

                        conn.setFixedLengthStreamingMode(new BigDecimal(mLength).intValueExact());

                        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

                        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

                        dos.writeBytes(twoHyphens + boundary + lineEnd);
                        dos.writeBytes("Content-Disposition: form-data; name=\"title\""+ lineEnd);
                        dos.writeBytes(lineEnd);
                        dos.writeBytes(Title);
                        dos.writeBytes(lineEnd);
                        dos.writeBytes(twoHyphens + boundary + lineEnd);

                        dos.writeBytes("Content-Disposition: form-data; name=\"description\""+ lineEnd);
                        dos.writeBytes(lineEnd);
                        dos.writeBytes(Description);
                        dos.writeBytes(lineEnd);
                        dos.writeBytes(twoHyphens + boundary + lineEnd);

                        dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + iFileName +"\"" + lineEnd);
                        dos.writeBytes(lineEnd);

                        Log.e(Tag,"Headers are written");

                        // create a buffer of maximum size
                        int bytesAvailable  =   fileInputStream.available();

                        int maxBufferSize   =   1024;
                        int bufferSize      =   Math.min(bytesAvailable, maxBufferSize);
                        byte[ ] buffer      =   new byte[bufferSize];

                        // read file and write it into form...
                        int bytesRead       =   fileInputStream.read(buffer, 0, bufferSize);

                        while (bytesRead > 0)
                        {
                                dos.write(buffer, 0, bufferSize);
                                bytesAvailable  = fileInputStream.available();
                                bufferSize      = Math.min(bytesAvailable,maxBufferSize);
                                bytesRead       = fileInputStream.read(buffer, 0,bufferSize);
                        }
                        dos.writeBytes(lineEnd);
                        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                        // close streams
                        fileInputStream.close();

                        dos.flush();
                        dos.close();

                        Log.e(Tag,"File Sent, Response: "+String.valueOf(conn.getResponseCode()));

                        InputStream is          =   conn.getInputStream();

                        // retrieve the response from server
                        int ch;

                        StringBuffer b          =   new StringBuffer();
                        while( ( ch = is.read() ) != -1 ){ b.append( (char)ch ); }
                        String s        =   b.toString();
                        Log.i("Response",s);
                        conn.disconnect(); //custom added

                }
                catch (MalformedURLException ex){   
                        Log.e(Tag, "URL error: " + ex.getMessage(), ex);
                }

                catch (IOException ioe){
                        Log.e(Tag, "IO error: " + ioe.getMessage(), ioe);
                }
        }
        @Override
        public void run() {
        }
}

服务器: -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
      string vTitle     =   "";
      string vDesc      =   "";
      string FilePath   =   Server.MapPath("save/android.jpg");        

      if (!string.IsNullOrEmpty(Request.Form["title"]))
      {
        vTitle = Request.Form["title"];
      }
      if (!string.IsNullOrEmpty(Request.Form["description"]))
      {
        vDesc = Request.Form["description"];
      }

      HttpFileCollection MyFileCollection = Request.Files;
      if (MyFileCollection.Count > 0)
      {
        // Save the File
        MyFileCollection[0].SaveAs(FilePath);
      }
    }
}

LogCat OutPut: -

08-27 10:54:08.370: E/fSnd(472): Starting Http File Sending to URL
08-27 10:54:09.312: E/fSnd(472): IO error: Broken pipe
08-27 10:54:09.312: E/fSnd(472): java.net.SocketException: Broken pipe
08-27 10:54:09.312: E/fSnd(472):    at org.apache.harmony.luni.platform.OSNetworkSystem.write(Native Method)
08-27 10:54:09.312: E/fSnd(472):    at dalvik.system.BlockGuard$WrappedNetworkSystem.write(BlockGuard.java:291)
08-27 10:54:09.312: E/fSnd(472):    at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:462)
08-27 10:54:09.312: E/fSnd(472):    at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:55)
08-27 10:54:09.312: E/fSnd(472):    at org.apache.harmony.luni.internal.net.www.protocol.http.FixedLengthOutputStream.write(FixedLengthOutputStream.java:41)
08-27 10:54:09.312: E/fSnd(472):    at java.io.OutputStream.write(OutputStream.java:82)
08-27 10:54:09.312: E/fSnd(472):    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156)
08-27 10:54:09.312: E/fSnd(472):    at com.example.imageupload.HttpFileUpload.Sending(HttpFileUpload.java:78)
08-27 10:54:09.312: E/fSnd(472):    at com.example.imageupload.HttpFileUpload.<init>(HttpFileUpload.java:29)
08-27 10:54:09.312: E/fSnd(472):    at com.example.imageupload.MainActivity.onCreate(MainActivity.java:37)
08-27 10:54:09.312: E/fSnd(472):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
08-27 10:54:09.312: E/fSnd(472):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712)
08-27 10:54:09.312: E/fSnd(472):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
08-27 10:54:09.312: E/fSnd(472):    at android.app.ActivityThread.access$1500(ActivityThread.java:122)
08-27 10:54:09.312: E/fSnd(472):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
08-27 10:54:09.312: E/fSnd(472):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 10:54:09.312: E/fSnd(472):    at android.os.Looper.loop(Looper.java:132)
08-27 10:54:09.312: E/fSnd(472):    at android.app.ActivityThread.main(ActivityThread.java:4025)
08-27 10:54:09.312: E/fSnd(472):    at java.lang.reflect.Method.invokeNative(Native Method)
08-27 10:54:09.312: E/fSnd(472):    at java.lang.reflect.Method.invoke(Method.java:491)
08-27 10:54:09.312: E/fSnd(472):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
08-27 10:54:09.312: E/fSnd(472):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
08-27 10:54:09.312: E/fSnd(472):    at dalvik.system.NativeStart.main(Native Method)

0 个答案:

没有答案