Android Socket + ObjectOutputStream 无法正常工作

2024-05-07

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

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

这是真正奇怪的部分,如果我发送一个布尔值或字符串(从设备)它会起作用......它只是我的“自定义”对象,但不能。我认为这适用于任何“标准”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();
        }
        
    }
}

Thanks!!


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Socket + ObjectOutputStream 无法正常工作 的相关文章

随机推荐

  • CodeIgniter,将数据从模型传递到控制器以在视图中使用

    我想将模型中查询的数据传递给控制器 为此我使用 return data 然后在我使用的控制器中 this gt load gt view my view data 据我了解var dump data 视图中应该显示查询的结果 事实并非如此
  • 使用比较器对向量进行排序,比较器会动态改变其行为

    我有一个自定义结构体的向量和一个属性列表 用于按优先级降序对该向量进行排序 例如 struct TheStruct artist String title String date String let order vec Vec
  • 具有多个 Angular + Nativescript 代码共享项目和可重用库的 Angular 工作区

    环境 tns 信息 获取 NativeScript 组件版本信息 组件原生脚本有更新 您当前的版本是 5 1 0 最新的可用版本是 5 1 1 组件 tns core modules 有更新 您当前的版本是 5 1 1 最新的可用版本是 5
  • 当用户滚动到页面底部时显示页脚

    这是我的页脚代码 div class row div class col md 12 div the part that always showing at the bottom div div div class col md 12 di
  • 有没有办法以编程方式检查 Excel 文件是否已打开

    我想检查特定的 Excel 文件是否已打开 否则 当我在 C 程序中重新打开同一文件时 它将以只读格式打开 有什么方法可以查出文件是否已经打开 如果该文件被另一个程序打开 则此代码可以帮助您找出该文件 但您将无法打开它 protected
  • 确定 .NET 类型的序列化大小和非托管内存效率

    我的问题是是否可以确定引用类型的序列化大小 以字节为单位 情况如下 我使用 BinaryFormatter 类来序列化基本 NET 类型 例如 Serializable public class Foo public string Foo1
  • 旋转设备后 Android 对话框重新打开

    我正在编写一个非常简单的应用程序来打开我的自定义共享对话框 XML 布局仅包含 1 个按钮
  • 在Rcpp中编译多个源文件

    我有以下目录结构 my func my func r cpp my func c my func h my func test c matrix matrix h matrix c The matrix目录包含一些矩阵结构matrix h以
  • 将图像小部件调整为父级高度但溢出宽度

    我想创建一个图像小部件 其大小适合其父级的高度 但随后根据显示图像的纵横比溢出父级的宽度 我试过了FittedBox和组合LayoutBuilder and SizedOverflowBox 但没有运气 到目前为止 我只能将图像的宽度和高度
  • 在 ttk 进度条中显示百分比

    我正在尝试显示百分比ttk Progressbar当该功能运行时提醒用户已执行的过程的范围以及剩余的内容 我能够显示百分比 但百分比最多23 哪一个是length of my tuple 我怎样才能让它达到100 length of tup
  • FreeMM 与 ShareMem

    我们有很多用 delphi 和 c builder 编写的 dll 库 并使用 sharemem 和 borlndmm dll 3d party 库中的对齐问题迫使我们转向 delphi 2007 中的新内存管理器 有人可以帮我解释一下 共
  • Linux 上的 OpenCL 编译

    我是 OpenCL 的新手 从昨天开始 我尝试使用 OpenCL 进行并行编程 而不是使用我更熟悉且以前体验过的 CUDA 现在我有 NVIDIA GTX 580 GPU Ubuntu Linux 12 04 操作系统和 CUDA SDK
  • 比较java中的数组和索引位置[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在一次 java 面试中 有人问我如
  • JS - document.getelementbysrc?

    是否可以从 src 属性的值获取元素 没有 DOM 方法可以按属性过滤元素 您需要遍历特定标签的所有元素并过滤掉那些匹配的元素src value function getElementsBySrc srcValue var nodes va
  • pandas:分割字符串和计数值? [复制]

    这个问题在这里已经有答案了 我有一个 pandas 数据集 其中有一列是逗号分隔的字符串 例如1 2 3 10 data id 1 score 9 topics 11 22 30 id 2 score 7 topics 11 18 30 i
  • 如何对 int[] 数组求和[重复]

    这个问题在这里已经有答案了 给定一个数组A of 10 ints 初始化一个名为的局部变量sum并使用循环查找数组中所有数字的总和A 这是我提交的答案 sum 0 while A lt 10 sum sum A 我在这个问题上没有得到任何分
  • 鼠标悬停时 WPF 按钮背景透明度

    我正在尝试更改某些按钮上的鼠标悬停效果 因为它们设置了不同的自定义背景颜色 因此当前将相同浅蓝色的鼠标悬停方案不太适合 我目前得到了这个
  • MVVM 消息传递与 RaisePropertyChanged

    MVVM 消息传递和 RaisePropertyChanged 之间有什么区别 当视图模型 B 中的属性发生更改时 我尝试在视图模型 A 中运行函数 哪种方法更适合使用 消息传递还是 RaisePropertyChanged 广播 谢谢 尼
  • 如何从替换特殊字符的字符串创建 URL?

    我正在尝试从 iframe 内部发出 jsonp 请求 由于某种原因 它似乎不起作用 看到这个question https stackoverflow com questions 20422125 no callback in jsonp
  • Android Socket + ObjectOutputStream 无法正常工作

    我正在开发一个客户端 服务器程序 其中客户端是 Android 设备 服务器有一个从输入流读取对象的侦听器类 我为另一台计算机创建了一个客户端软件 该软件通过本地网络发送一个小对象 计算机到计算机工作得很好 我读取了该对象并打印了内容 但是