java.net.socketException:sendto失败:epipe(损坏的管道)发送字节[]



我正在尝试上传通过Android Mobile录制的视频。但是,在将视频作为字节[]发送到服务器时,我要低于错误:

  01-20 13:03:18.250: E/SaveMedia-response(4393): java.net.SocketException: sendto failed: EPIPE (Broken pipe)

这是我尝试上传视频的方式:

        SoapObject request = new SoapObject(
                HelpMeConstant.WSDL_TARGET_NAMESPACE, "SaveMedia");
        Log.i("SaveMedia-parameter", "Email : " + Email + ", Media : " + Media
                + "MediaType : " + MediaType + ",MediaExt : " + MediaExt);
        MediaAvidance mediainfo = new MediaAvidance();
        mediainfo.EmailId = Email;
        mediainfo.Media = Media;
        mediainfo.MediaExt = MediaExt;
        mediainfo.MediaType = MediaType;
        PropertyInfo pi = new PropertyInfo();
        pi.setName("mediainfo");
        pi.setValue(mediainfo);
        pi.setType(mediainfo.getClass());
        request.addProperty(pi);
/*      request.addProperty("EmailId",Email);
         request.addProperty("Media", Media); 
         request.addProperty("MediaType", MediaType);
         request.addProperty("MediaExtn", MediaExt);
*/       
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        Log.i("SaveMedia","Serialising..");
        new MarshalBase64().register(envelope);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE httpTransport = new HttpTransportSE(
                HelpMeConstant.SOAP_ADDRESS);
        Object response = null;
        try {
            Log.i("SaveMedia","Calling service..");
            httpTransport.call(HelpMeConstant.SOAP_ACTION + "SaveMedia",
                    envelope);
            Log.i("SaveMedia","getting response..");
            response = envelope.getResponse();
        } catch (Exception exception) {
            response = exception.toString();
        }
        Log.i("response", response.toString());
        return response.toString();

它正在发送到以下内容的.NET Web服务:

 [WebMethod]
    public string SaveMedia(MediaAvidance avidanceinfo)
    {
        rs = new ResultSet();
        rs = logictask.SaveMedia(avidanceinfo.EmailId,avidanceinfo.Media,avidanceinfo.MediaType,avidanceinfo.MediaExt);
        return rs.isSuccessfull;
    }

mediaVidance:

public class MediaAvidance implements KvmSerializable {
    public String EmailId;
    public byte[] Media;
    public String MediaType;
    public String MediaExt;
    public MediaAvidance() {
    }
    public MediaAvidance(String EmailID, byte[] Media, String MediaType,
            String MediaExt) {
        this.EmailId = EmailID;
        this.Media = Media;
        this.MediaType = MediaType;
        this.MediaExt = MediaExt;
    }
    @Override
    public Object getProperty(int arg0) {
        switch (arg0) {
        case GETEMAILID:
            return EmailId;
        case GETMEDIA:
            return Media;
        case GETMEDIATYPE:
            return MediaType;
        case GETMEDIAEXT:
            return MediaExt;
        default:
            return null;
        }
    }
    @Override
    public int getPropertyCount() {
        // TODO Auto-generated method stub
        return 4;
    }
    @SuppressWarnings("rawtypes")
    @Override
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
        switch (index) {
        case 0:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "EmailId";
            break;
        case 1:
            info.type = PropertyInfo.OBJECT_CLASS;
            info.name = "Media";
            break;
        case 2:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "MediaType";
            break;
        case 3:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "MediaExt";
            break;
        default:
            break;
        }
    }
    @Override
    public void setProperty(int index, Object value) {
        switch (index) {
        case 0:
            EmailId = value.toString();
            break;
        case 1:
            Media = (byte[]) value;
            break;
        case 2:
            MediaType = value.toString();
            break;
        case 3:
            MediaExt = value.toString();
            break;
        default:
            break;
        }
    }
}

在服务器端MediaVidance类Donot实施KvmSerializable及其方法。

我搜索了几天,并在Stackoverflow&中遇到了许多问题。了解我要在连接关闭时试图编写,而且它与套接字编程有关。但是

我不知道如何保持连接(可能是我认为的解决方案)。请帮我。

谢谢Sourabh

我终于设法使它起作用。发布此解决方案,希望它对像我这样的人有用。您可能会在代码中遇到更多或任何以下问题,但是我很乐意犯这三个错误并向它们学习,这在视频上传中引起了问题:

  1. 我通过实现KvmSerializable在Android中序列化MediaAvidance,但是为了使其工作,您的服务器端MediaAvidance也必须序列化。我已经通过以下代码完成了解决我的Cannot Serialize例外的代码:
[可序列化]   公共类MediaVidance 

您还需要将SoapSerializationEnvelope注册到MarshalBase64

envelope = new SoapSerializationEnvelope(Soapenvelope.ver11);   新元帅64()。注册(信封);
  1. 当您从Android调用时,在PropertyInfo中与您在服务方法参数中设置完全相同的名称(例如:AvidanceInfo),此求解了faultstring: 'Server was unable to read request.例外:

    Android中定义的属性名称

    pi.setname(" avidanceinfo"); 

    服务方法:

    [WebMethod] 公共字符串Savemedia(MediaVidance Avidanceinfo)
  2. 最终您需要添加 envelope.implicitTypes = true ;
    因此HttpTransportSE将能够在服务器上识别MediaAvidance类型,您将获得Object reference not set to an instance of an object. when using xs:anyType....例外。

*希望这对您有帮助。:) *

最新更新