【问题标题】:Receiving an object via ObjectInputStream通过 ObjectInputStream 接收对象
【发布时间】:2013-07-13 08:23:16
【问题描述】:

我正在使用 Java 在 Android 和 Windows 上编写服务器-客户端应用程序。我想将用户的信息(用户名和密码)发送到服务器进行验证。客户端发送包含信息的对象,但服务器没有收到它! 这是 Object 类:

package Model;

import java.io.Serializable;

public class StringObject implements Serializable {

private static final long serialVersionUID = 1L;
private String Username=null;
private String Password=null;

public void setPassword(String Password){
    this.Password=Password;
}
public void setUsername(String Username){
    this.Username=Username;
}
public String getPassword(){
    return Password;
}
public String getUsername(){
    return Username;
}
}

客户端代码:

private void Login(){
    try {
ObjectOutputStream OutObj=new  ObjectOutputStream(newBufferedOutputStream(connection.getOutputStream()));
                OutObj.writeObject(UserPass);
                OutObj.flush();
            } catch (IOException e) {
        Log.d("Application: ",e.toString());}

(我在这行之前设置了 Object 变量)

和服务器代码:

  ObjectInputStream inObj = new ObjectInputStream(new         BufferedInputStream(connection.getInputStream()));
        UserPass=(StringObject) inObj.readObject();
        System.out.println("UserName: " + UserPass.getUsername());
        System.out.println("Password: " + UserPass.getPassword());

客户端程序 (android) 因错误而崩溃:线程以未捕获的异常退出。 (socket 和 I/O 代码行在一个单独的线程中)

07-15 12:43:59.626: W/dalvikvm(1306): threadid=13: thread exiting with uncaught exception (group=0x40a71930)
07-15 12:43:59.626: E/AndroidRuntime(1306): FATAL EXCEPTION: Thread-89
07-15 12:43:59.626: E/AndroidRuntime(1306): java.lang.NullPointerException
07-15 12:43:59.626: E/AndroidRuntime(1306):     at com.shayan.filesharing.ConnectionThread.Login(ConnectionThread.java:90)
07-15 12:43:59.626: E/AndroidRuntime(1306):     at com.shayan.filesharing.ConnectionThread.ProcessMessage(ConnectionThread.java:70)
07-15 12:43:59.626: E/AndroidRuntime(1306):     at com.shayan.filesharing.ConnectionThread.run(ConnectionThread.java:47)

但是当我用 BufferedWriter/bufferedReader 替换 ObjectOutputStream/ObjectInputStream 时,它工作正常!谁能告诉我为什么会这样?

【问题讨论】:

  • 请粘贴故障转储和错误代码,以便我们告诉您发生的位置以及可能发生的原因。
  • 当然!我已经编辑了我的问题...
  • 您的登录方法中的第 90 行是哪一行?
  • 旁注:Java 的命名约定遵循lowerCamelCase 表示法。
  • 第 90 行是: if(in.readLine().equals("Valid")){ ...但服务器没有发送“有效”消息,因为它没有收到对象!

标签: java serialization io nullpointerexception objectinputstream


【解决方案1】:

引用:

   07-15 12:43:59.626: E/AndroidRuntime(1306): java.lang.NullPointerException
   07-15 12:43:59.626: E/AndroidRuntime(1306):     at com.shayan.filesharing.ConnectionThread.Login(ConnectionThread.java:90)
   07-15 12:43:59.626: E/AndroidRuntime(1306):     at com.shayan.filesharing.ConnectionThread.ProcessMessage(ConnectionThread.java:70)
   07-15 12:43:59.626: E/AndroidRuntime(1306):     at com.shayan.filesharing.ConnectionThread.run(ConnectionThread.java:47)

你能在line 90 上显示罚款ConnectionThread.java 吗?你在那里得到一个空指针,它可能与你的网络没有任何关系,而是一个错误/未初始化的引用。

【讨论】:

  • 你是说第 90 行?是 : if(in.readLine().equals("Valid")){ Log.d("Application: ","Valid");可能是 in.readline() 为空,但 in (Input Stream) 已经初始化!
  • 您必须先检查 readLine() 的结果是否为 null,然后再对它执行任何其他操作。
【解决方案2】:

不要为每个事务创建新的对象流。在两端的套接字的生命周期中使用相同的流。对象流读取和写入标头,因此为每个套接字创建多个实例只会与另一端不同步。

【讨论】:

  • 我需要通过 BufferedWriter 向服务器发送消息,并通过 ObjectOutpuStream 发送一个对象。在这两种情况下,我都使用 connection.getOutputStream() 。我该怎么办?
  • 问题不在于写作。问题是阅读。您可以使用 BufferedInputStream/BufferedReader,但如果您断开连接并将第二个读取器附加到同一流,则第一个缓冲读取器读取的字节数可能比包装器实际消耗的字节数多。因此,例如,拥有 ObjectInputStream(BufferedInputStream(InputSteam)).readObject() 可能会读取比对象更多的字节到缓冲流中......(就像你的“有效”文本),所以如果你停止阅读那里并且使用附加到输入流的不同阅读器,数据可能不再存在。
  • 非常好!谢谢。所以我该怎么做?而不是 BufferedReader.readLine() 然后 ObjectInputStream.readObject() 我应该使用什么?
  • 有很多选择,例如readUTF()/writeUTF(),但为什么不把 everything 作为一个对象发送呢?
  • 是的!将所有内容作为对象发送将起作用!我正在尝试。谢谢你帮助我!
猜你喜欢
  • 1970-01-01
  • 2013-10-28
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多