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.
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
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?
[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 …
[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 …
[/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…