【问题标题】:ObjectOutputStream between Java (PC) and Android doesnt workJava(PC)和Android之间的ObjectOutputStream不起作用
【发布时间】:2015-12-15 20:51:08
【问题描述】:

嘿嘿,

我正在为 Android 编写的 Messenger 出现问题。问题是,电话和 PC 上的插座连接没有任何问题。但是他们无法获得 ObjectInputStream 和 ObjectOutputStream (InputStream 和 OutputStream 工作正常:/)。不在手机上,也不在电脑上。

我在 Google 上找不到任何解决方案;找了一整天....这是否是由于系统之间的一些冷漠造成的正常现象?

非常感谢您的帮助;)

@Override
public void run() {
    inputStream=null;
    outputStream=null;
    System.out.println("Streams initialized");

    try{
        inputStream=new ObjectInputStream(clientSocket.getInputStream());
        System.out.println("Inputstream");
        outputStream=new ObjectOutputStream(clientSocket.getOutputStream());
        System.out.println("Outputstream");

        SendObject sendObject=null;

        System.out.println("Streams get");
        connected=true;


        while(inputStream!=null&&connected){


        }

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





}

这是服务器端的代码(int the ThreadHandler),只是停在 inputStream=new ...

接下来,这是智能手机上的代码

private void initNetwork(){
    try {
        Log.d("Networking","init");
        final int SERVERPORT = 21000;
        final String SERVERADRESS = "192.168.2.22";
        socket = new Socket();

        Log.d("Networking", "new Socket created");
        socket.connect(new InetSocketAddress(SERVERADRESS, SERVERPORT), 3000);
        Log.d("Networking", "Socket connected");
        ois =new ObjectInputStream(socket.getInputStream());
        oos =new ObjectOutputStream(socket.getOutputStream());
        connected = true;
        Log.d("Internet", "Connected");
    }catch (InterruptedIOException e){
        Log.d("Networking","Imeout");
    }catch (IOException e){
        connected=false;
        Log.d("Internet","Not Connected");
        e.printStackTrace();
    }
}

AndroidStudio 显示的最后一条日志是 Log.d("Networking", "Socket connected");

【问题讨论】:

  • 如果您遇到任何问题,请将您的代码添加到问题和错误堆栈跟踪中。
  • 您必须为您的对象共享相同的定义,包括序列号。我猜你是这么做的,但我能想到的信息就这么少
  • 没有任何错误,看起来像超时:/

标签: java android objectinputstream


【解决方案1】:

这完全符合预期。 ObjectInputStream 的构造函数将尝试立即从提供的流中读取。你试过在套接字上写东西吗?

来自ObjectInputStream(InputStream)的Javadoc:

创建一个从指定对象读取的 ObjectInputStream 输入流。从流中读取序列化流标头并 已验证。这个构造函数会阻塞,直到对应的 ObjectOutputStream 已写入并刷新了标头。

【讨论】:

  • 手机和服务器上的ois和oos是在连接socket后同时创建的。因此,它们应该能够通信。但他们没有。初始化的进度刚好停在ois和oos的初始化前面......所以我不能写任何串行数据(我为此有一个叫SendObject的对象,它实现了可串行化)
  • 我不明白。如果它们在不同的设备上运行,您如何确保它们是“同时”创建的?您是否尝试过调用oos =new ObjectOutputStream(socket.getOutputStream()); 之前 ois =new ObjectInputStream(socket.getInputStream());?否则,您将在各自的构造函数中阻塞两个线程。
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多