【发布时间】:2018-10-27 11:02:44
【问题描述】:
我正在使用 Android 应用程序,我需要在 Android 客户端和 Java 服务器之间发送序列化对象(主要来自客户端类)。
我正在使用 ObjectInputStream 和 ObjectOutputStream 通过 Web 套接字发送对象,但是当在服务器中读取对象时,它似乎试图将其转换为 Android 包而不是服务器包中的客户端类。
这是我在 Android 的主 Activity 中调用的简化代码:
package com.example.razer.clienttest;
import android.os.AsyncTask;
import android.widget.Toast;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MessageSender extends AsyncTask<Void,Void,Void> {
ClienteFree cliente = new ClienteFree();
String test = "Testing this crap";
static String ip = ""; //This is where I'm putting my IP
@Override
protected Void doInBackground(Void...voids){
try{
Socket s = new Socket(ip,7000);
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
//oos.writeObject(test);
oos.writeObject(cliente);
oos.flush();
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
//String Test2 = (String) ois.readObject();
ClienteFree cliente2 = (ClienteFree)(ois.readObject());
is.close();
ois.close();
os.close();
oos.close();
s.close();
}catch(Exception e){
System.out.println(e);
}
return null;
}
}
还有我的服务器实现:
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
public class Server {
static List<ClienteFree> clientes = new ArrayList<ClienteFree>();
ClienteFree client = new ClienteFree("Null","Null","Null","null");
String Test = "Testing this crap again";
public static final int PORT = 7000;
public static void main(String[] args) throws IOException, ClassNotFoundException {
try {
new Server().runServer();
} catch (Exception e) {
e.printStackTrace();
}
}
public void runServer() throws Exception {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server up and ready for connection...");
Socket socket = serverSocket.accept();
System.out.println("Connection succesful");
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
//String Test2 = (String) ois.readObject();
client = (ClienteFree)(ois.readObject());
//System.out.println(Test2);
doSomething(client);
//oos.writeObject(Test);
oos.writeObject(client);
oos.flush();
ois.close();
oos.close();
socket.close();
serverSocket.close();
}
private void doSomething(ClienteFree client){
clientes.add(client);
System.out.println(client.getName());
client.setName("Poncho");
}
}
错误显示服务器试图在 Android 包 com.example.razer.clienttest.ClienteFree(我的 android 包)中查找类,而不是服务器之一。如果对象中包含 Observable 类型对象的列表,是否有人知道如何解决此问题或在 Android 和 Java 服务器之间发送对象的正确方法?
我尝试使用 SQL 库将客户端对象从我的服务器序列化到 MySQL 数据库,并且它有效,但我还没有在 Android 中找到合适的方法。
这是我得到的错误:
Server up and ready for connection...
Connection succesful
java.lang.ClassNotFoundException: com.example.razer.clienttest.ClienteFree
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Server.runServer(Server.java:54)
at Server.main(Server.java:15)
谢谢!
【问题讨论】:
标签: java android sockets serialization server