如何使用套接字TCP在java和android之间正确传递对象?

时间:2016-05-13 17:08:16

标签: java android sockets tcp

我正在尝试使用Android应用程序和Java应用程序使用TCP / IP发送对象。 但我遇到的问题是信息无效。

该对象属于一个名为Mensaje的类,并且在这两个项目中具有相同的包名称并具有相同的serialVersionUID:

package CLASSESS;

import java.io.Serializable;


public class Mensaje implements Serializable{
   // private static final long serialVersionUID = 5950169519310163575L;
   private static final long serialVersionUID = 9178463713495656548L;
    public static int TYPE;
    public static int ID;
    public static String DATA;
}

Android应用程序类实现Serializable并将conexion处理为威胁

public class SocketClient implements Serializable{



private Runnable send_ObjectMessage = new Runnable(){
        public void run(){

            try {
                obj_Mensaje = new Mensaje();
                obj_Mensaje.TYPE = 1;
                obj_Mensaje.ID = 2;
                obj_Mensaje.DATA= "hOKA MUNDO";
                salida_mensaje = new ObjectOutputStream(socket_cliente.getOutputStream());
                salida_mensaje.writeObject(obj_Mensaje);
                salida_mensaje.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    };
}

服务器具有相同的Mensaje类,并使用相同的serialVersionUID实现Serializable;

服务器读取威胁上的对象。

@Override
public void run() {
    try {
        obj_message_read = new Mensaje();
        ois_readMessage = new ObjectInputStream(clientSocket.getInputStream());
        while(clientSocket.isConnected()){
            Object aux = ois_readMessage.readObject();
            if(aux instanceof Mensaje){
                obj_message_read = (Mensaje)aux;
                setDATA(obj_message_read.DATA);
                setTYPE(obj_message_read.TYPE);
                setID(obj_message_read.ID);
                System.out.println("Data" + obj_message_read.DATA);

            }
        }
    }catch (IOException ioe){
        ioe.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

问题是来自Mensaje的信息是空的。 所以当我打印System.out.println("Data" + obj_message_read.DATA);时 服务器打印

  

数据空

1 个答案:

答案 0 :(得分:1)

我认为问题在于您尝试发送的字段被声明为static,这对于序列化是暂时的。

更改它删除该关键字:

public class Mensaje implements Serializable{
   // private static final long serialVersionUID = 5950169519310163575L;
   private static final long serialVersionUID = 9178463713495656548L;
    public int TYPE;
    public int ID;
    public String DATA;
}