2014-01-20 3 views
3

Я пытаюсь загрузить видео, записанное через Android-телефон. но при отправке видео в качестве байт [] к серверу я получаю ниже ошибки:java.net.SocketException: sendto failed: EPIPE (Broken pipe) при отправке байта []

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 который, как показано ниже:

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

MediaAvidance:

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; 
     } 
    } 
} 

На стороне сервера MediaAvidance класс donot реализует KvmSerializable и его метод.

Я искал несколько дней и прошел через много вопросов в stackoverflow & понял, что я пытаюсь писать, когда соединение закрыто, а также что это связано с программированием сокетов. BUT

Я не знаю, как поддерживать связь (возможно, решение, я думаю). Пожалуйста, помогите мне.

Спасибо, Sourabh

+0

Вы можете предоставить больше строк с вашей трассировки ошибок сервера здесь. И вы можете здесь вставить класс MediaAvidance. – kingAm

+0

Добавлен код класса MediaAvidance. У меня нет следов стека в исключении. это все, что у меня есть как исключение. –

+0

В вашем коде клиента вы принимаете это видео в виде массива байтов, а затем передаете его в свой запрос на мыло. Скорее всего, из-за большого размера массива байтов, ваше соединение с сервером или клиентом закрывается до завершения загрузки. Можете сохранить это соединение в течение нескольких минут, когда ваш файл будет загружен. Вы можете его искать. Возможно, вы не решите свою проблему, выполнив ее только на стороне клиента. Если у вас есть контроль над сервером, тогда для теста сначала попробуйте загрузить изображение с несколькими байтами, если оно будет успешно загружено, тогда мы сможем подтвердить вашу точную проблему здесь , – kingAm

ответ

0

я, наконец, удалось получить его работу. отправляя это решение, надеясь, что это будет полезно для кого-то вроде меня. Вы могли бы иметь более или любые из ниже проблем в вас коде, но я счастлив, чтобы сделать эти 3 ошибку, и учиться у них, что вызывало проблему в загрузке видео:

  1. У меня есть сериализованная MediaAvidance в андроиде, реализовав KvmSerializable, но для его работы ваша серверная сторона MediaAvidance также должна быть сериализована. что я сделал с помощью ниже код, который решал мой Cannot Serialize Exception я получаю:
 [Serializable] 
    public class MediaAvidance

Вам также необходимо зарегистрировать SoapSerializationEnvelope в MarshalBase64:

 envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    new MarshalBase64().register(envelope);
  1. при вызове из андроида , установить то же имя в PropertyInfo, как у вас есть в параметре метода службы (например: avidanceinfo), этот разрешен faultstring: 'Server was unable to read request. исключение:

    Имя

    свойства, определенные в андроиде методы

    pi.setName("avidanceinfo");

    услуги:

     
    [WebMethod] 
    public string SaveMedia(MediaAvidance avidanceinfo)

  2. В последней вашей потребности добавить envelope.implicitTypes = true ;
    так что HttpTransportSE сможет распознавать MediaAvidance типа на сервере иначе вы получите Object reference not set to an instance of an object. when using xs:anyType.... Исключение.

* Надеюсь, это может быть полезно для вас. :) *

Смежные вопросы