1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Transferir imagem entre aplicativos Java e C++ através de Sockets

Estou tentando enviar um arquivo através de sockets de uma aplicação java para uma aplicação C++. Eu consigo fazer com arquivos textos, mas as imagens são danificadas no meio do caminho e não abrem depois. Vale dizer que o tamanho total do arquivo recebido é 2 bytes maior do que o arquivo enviado, mas não faço ideia da onde estou errando. Vocês podem me ajudar ?

O cliente java:

public void enviaArquivo(File file)
    {
    byte[] bytes = new byte[1024];
    int total=0;
      try(FileInputStream fis=new FileInputStream(file))
      {
        try(BufferedInputStream bis=new BufferedInputStream(fis))
        {
          try(BufferedOutputStream out1=new BufferedOutputStream(this.out))
          {
          int count;
            while((count=bis.read(bytes,0,bytes.length))!=-1) 
            {
            out1.write(bytes, 0, count);
            System.out.println("enviado="+count);
            total+=count;
            }
          out1.flush();
          }
        }
      System.out.println("total enviado="+total);
      }
      catch(IOException ex)
      {

      }
    }

o servidor C++:

bool receive(string file,int tamanho)
{
HANDLE hFile=CreateFileA(file.c_str(),GENERIC_WRITE,0,0,
                         CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  if(hFile==INVALID_HANDLE_VALUE) 
  {//NESTA FUNÇÃO, O ARQUIVO SERÁ CRIADO
  return false;
  }
char* buf=new char[1025];
DWORD recebido=1;
unsigned long recebido2;
BOOL errou=false;
DWORD bytesEscritos=0;
int totalRecebido=0;
ostringstream stream;
  while(recebido!=0)
  {
  memset(buf,0,sizeof(buf));
  recebido=recv(this->s,buf,1024,0);
  buf[recebido]='\0';
  stream << "recebido=" << recebido << "/";
  Logger::log(stream.str());
  stream.clear();
  errou=WriteFile(hFile,buf,recebido,&bytesEscritos,NULL);
    if(errou==false)
    {
    return false;
    }
  totalRecebido+=recebido;
  }
  stream << "Total Recebido="<<totalRecebido<<"/";
  Logger::log(stream.str());
CloseHandle(hFile);
return true;
}
  • Já tentou abrir os dois arquivos em algum editor hexadecimal e compara-los? Isso pode te dar uma dica do que está diferente. Uma das diferenças pode ser o \0 que você insere ao final do arquivo no C++. Além disso, seu protocolo não parece organizado. Por exemplo, não vi em local nenhum você enviar o tamanho do arquivo. Nesse caso, como o C++ saberia onde terminar de ler? Ou cada imagem tem exatamente 1024 bytes?

    ViniGodoy   17 de fev de 2015
  • O método que chama o enviaArquivo no Java já enviou o tamanho total para o C++, então meu programa em C++ já sabe o tamanho do arquivo.

    Kratos   17 de fev de 2015
  • Engraçado, não estou vendo esse controle nesse seu trecho de código. Aparentemente, você está parando de ler quando o recv retornar 0. E ele só retorna 0 quando a conexão for fechada, não necessariamente quando o arquivo terminar.

    ViniGodoy   17 de fev de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java c++ sockets arquivos imagens ou faça a sua própria pergunta.