Enviando Objetos/Arquivos via socket

Bom dia senhores,
tenho um arquivo chamado comp.dat onde salvo meus objetos serializable. Logicamente os carrego em uma lista e os crio na tela. Preciso enviar estes objetos via rede para outra máquina recriando a tela do servidor. A seguinte dúvida que tenho é:

O que é melhor?
Enviar o arquivo ou os objetos?

Se for enviar o arquivo, como fazer? A mesma dúvida tenho para enviar os objetos caso seja melhor.

Lembro que estou usando socket.

Obrigado.

Depende.

Você precisa enviar absolutamente tudo o que serializa para remontar o objeto do outro lado? Ou você poderia enviar menos informação?

Os sockets brutos trabalham com o formato binário, então, tanto faz a forma que você faça a serialização. O importante é só ter um protocolo coeso:
http://www.guj.com.br/posts/list/136538.java#735860

E entender bem como o TCP/IP funciona. Se for enviar um arquivo, você pode também implementar um protocolo já conhecido, como o FTP:
http://www.faqs.org/rfcs/rfc959.html

Ou mesmo o TFTP:
http://www.faqs.org/rfcs/rfc1350.html

O que preciso enviar está no HashSet, nele tenho posição X,Y na tela, tenho configurações entre outros. Se eu conseguir enviar a HashSet dos objetos ia resolver meu problema. O tamanho da tela funciona legal, mas o HashSet não está indo, quando vou carregar os objetos na tela cliente tenho erro. Como você mesmo disse, todos eles estão Serializados e todos tem o método toString reescrito (pois ele que guardo no arquivo). Será que estou tendo problema de conversão ou não estou esperando terminar a transmissão completa do HashSet? Ou ainda, será que ele não está sendo transmitido?

Depende… como vc escreveu seu protocolo?

Uma dica, não confie em ObjectInputStream e ObjectOutputStream quando o assunto for sockets.

[quote=ViniGodoy]Depende… como vc escreveu seu protocolo?

Uma dica, não confie em ObjectInputStream e ObjectOutputStream quando o assunto for sockets.[/quote]

Vini, sei que não recomenda, obviamente, conforme escrito acima. Já estou tentando montar meu proprio protocolo. Mas poderia me tirar uma dúvida: estou tentando enviar um objeto entre o android e uma aplicação java, e sempre na hora de criar o objeto no servidor tenho uma ClassNotFoundException… Sabe se estas classes são diferentes no java e no android ? Valeu, muito obrigaod por antecipação …
ps, estou correndo atras de fazer meu protocolo, com seu típico, mas tá dificil pois tenho muita coisa a entender … :confused:

[quote=Frital]Vini, sei que não recomenda, obviamente, conforme escrito acima. Já estou tentando montar meu proprio protocolo. Mas poderia me tirar uma dúvida: estou tentando enviar um objeto entre o android e uma aplicação java, e sempre na hora de criar o objeto no servidor tenho uma ClassNotFoundException… Sabe se estas classes são diferentes no java e no android ? Valeu, muito obrigaod por antecipação …
ps, estou correndo atras de fazer meu protocolo, com seu típico, mas tá dificil pois tenho muita coisa a entender … :confused:
[/quote]

Depende… de que classe você está falando? Especialmente no seu caso, com JDKs, VMs e dispositivos diferentes, é um risco enorme usar o ObjectInputStream e o ObjectOutputStream. Especialmente em classes que não foi você quem escreveu.

Bom, estou quase conseguindo usar “meu” protocolo hihi, obrigado Viny.
Desculpa a ignorância, mas como faria a leitura desta mensagem ? Abaixo posto meu código, comunicando meu android com meu servidor Java.

Abaixo o codigo do android, que está enviando a mensagem:

package br.edu.iftm.comunic;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main extends Activity {
	
	private final String ip="10.0.2.2";
	private final int porta = 7777;
	Socket cliente;
	
	
	Button btnLogar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnLogar = (Button) findViewById(R.main.btn_Login);
        btnLogar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				try {
					btnLogar_onClick(v);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					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;
    }
    
    public void btnLogar_onClick(View v) throws IOException{
    	EditText login = (EditText) findViewById(R.main.login);
    	EditText senha = (EditText) findViewById(R.main.senha);
    	TextView resposta = (TextView) findViewById(R.main.resposta);
    
    	cliente = new Socket(ip, porta);
    	enviarMensagem(codificarString(login.getText().toString()));
    	
    }
    
    public ByteArrayOutputStream codificarString(String str) throws IOException 
    {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        dos.writeByte(1); //Mensagem 1, login
        dos.writeChars(str); // String a ser enviada;
        return bos;
    }
    
    public void enviarMensagem(ByteArrayOutputStream mensagem) throws IOException
    {
       byte[] msg = mensagem.toByteArray();
       DataOutputStream out = new DataOutputStream(cliente.getOutputStream());
       out.writeInt(msg.length); //o tamanho da mensagem
       out.write(msg); //Os dados
       out.flush();
    }
    
    
}

e abaixo, o codigo do servidor, no qual estou em dúvida como efetuar a leitura:

package servidorcomunic;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServidorComunic {
    
    private static final int porta = 7777;

    
    public static void main(String[] args) throws IOException, ClassNotFoundException {
    
    ServerSocket server = new ServerSocket(porta);
    System.out.println("Socket aberto na porta " + porta);
    System.out.println("esperando ...");
    Socket conexao= server.accept();
    System.out.println("conectou !");
    DataInputStream input = new DataInputStream(conexao.getInputStream()); 
    System.out.println(input.readInt());
   // já tou lendo o tamanho, e o conteúdo ? os chars .. 
    }
}

aproveito pra perguntar, como faria pra transmitir inúmeros dados, por exemplo, um arraylist de objetos de clientes (ou seja, com vários atributos) …
muito obrigado por antecipação…