java - Android Socket + ObjectOutputStream 无法正常工作

标签 java android sockets objectoutputstream classnotfoundexception

我正在开发一个客户端/服务器程序,其中客户端是一个 android 设备。

服务器有一个监听器类,它从输入流中读取一个对象。我为另一台计算机创建了一个客户端软件,它通过本地网络发送一个小对象。 Computer to Computer 运行良好,我读取了对象并打印了内容。但是,移植到 android 的 SAME 代码(我重写它以防万一)不起作用。我构建了一个可序列化的对象(任何对象),并通过 ObjectOutputStream 发送它。我在计算机上运行的服务器确实连接到设备,但它给了我一个 ClassNotFound 异常,即使我正在打印对象(它有一个 toString)。正如我所说,在另一台计算机上运行的相同代码(作为 .jar 文件)运行良好。

这里是真正奇怪的部分,如果我发送一个 boolean 值或字符串(从设备),它就可以工作......它只是我的“自定义”对象不工作。我认为这适用于任何“标准”Java 对象。

如果您确实发现错误,请记住代码确实有效,但只能从另一台计算机到我的计算机...而不是从 Android 设备到计算机。如果您仍然发现另一个明显的错误,那就太棒了 :)

安卓程序:

package WaitDroid.Main;

import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class main extends Activity {
/** Called when the activity is first created. */
private Button a;
private TextView x;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.a = (Button) this.findViewById(R.id.Send_Order);
    this.x = (TextView) this.findViewById(R.id.TextView1);
    this.a.setOnClickListener(new OnClickListener()
    {
        
        @Override
        public void onClick(View arg0)
        {
            sendMenu();
        }
    });
}

private void sendMenu()
{
     try
     {
         InetAddress serverAddress = InetAddress.getByName("128.153.180.109");
         Socket socket = new Socket(serverAddress, 4322);
         ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
         TestObject send = new TestObject("Hi", 32);
         out.writeObject(send);
         out.close();
         socket.close();
         }
         catch(Exception e)
         {
         x.setText(e.getMessage());
         }
    }
}

测试对象:

package WaitDroid.Main;

import java.io.Serializable;

public class TestObject implements Serializable
{
    private String name;
    private int number;

    public TestObject(String a, int b)
    {
        name = a;
        number = b;
    }

    public String toString()
    {
        return name +" - "+ number;
    }
}

服务器监听器:

package Main;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectInputStream.GetField;
import java.net.ServerSocket;
import java.net.Socket;

import Order.Order;

public class ServerListener extends Thread 
{

    public void run() {
        try {
            ServerSocket listen = new ServerSocket(4322);

            while (true) {
                Socket socket = listen.accept();
                String clientInetAddr = socket.getInetAddress().toString();
                ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

                System.out.println("Connected to: " + clientInetAddr);
                
                try
                {
                    Object a = in.readObject();
                    System.out.println(a);
                    //RestaurantServerRun.n.server.addOrder(a);
                }
                
                catch(IOException e)
                {
                    System.err.println(e.getMessage());
                }

                in.close();
                socket.close();
            }
        }
        catch (Exception e) {
            System.err.println("Error in run()");
            e.printStackTrace();
        }
        
    }
}

谢谢!!

最佳答案

我怀疑 Android 的序列化格式可能与 Java VM 的格式不兼容。您可以尝试将您的对象转换为 XML 或其他一些文本格式吗?

关于java - Android Socket + ObjectOutputStream 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3964709/

相关文章:

模拟 Swing 静态方法时的 java.lang.VerifyError

java - 使用 Parcelable 有什么优点?

java - 无法在 scala/java 中解压使用 Windows "Sent to compressed folder"创建的文件

java - 直接启动其他应用程序

android - 将 Google Drive 集成到 Android 应用程序中, Unresolved 导入

android - Meteor:即使我设置了正确的路径,当我尝试通过 Ubuntu 构建时也找不到 ANDROID_HOME

java - 保持 SocketServer 处于 Activity 状态,直到 Frame 关闭

c++套接字接收图像并显示而不保存

java - Java中用于解析文本格式的 Protocol Buffer `ParseFromString`?

java - int循环的计​​算和比较?