【问题标题】:Object showing instead of String when received through a stream通过流接收时显示对象而不是字符串
【发布时间】:2014-01-22 11:03:53
【问题描述】:

希望我不需要用我的代码来淹没这篇文章,但如果需要,请询问。 另外,我只将getPassword().toString() 用于测试目的,我没有在我的任何应用程序中使用它。

客户端: 从JPasswordField passfield获取密码,通过ObjectOutputStream out作为字符串发送

服务器端: 通过ObjectInputStream in接收字符串,打印到控制台

很简单,但我遇到的问题是,它不是显示字符串,而是打印一个对象([C@6af3a631) 我发送和接收对象的方式非常简单:

客户:

out.writeObject(passfield.getPassword().toString())

服务器:

Object data;

while((data = in.readObject) != null) {
    if(data instanceof String) {
        System.out.println(data);
    }
}

如果我发送"hey" 而不是passfield.getPassword().toString()),字符串打印出来就好了。 我对 ObjectOutputStream 已经很熟悉了,而且我从来没有遇到过这个问题,所以我猜它可能与 JPasswordField

这是帮助我理解更大问题的一小步(包含密码的数据包发送得很好,数据包接收得很好,但密码变量为空)。

【问题讨论】:

  • passfield.getPassword().toString() 永远不要调用它。 String 实例可能会在 JVM 中徘徊以被盗,因此永远不要将密码转换为 String
  • 是的,我明白了,这仅用于测试目的。我当时认为 char[] 可能会造成一些干扰,所以我将其作为字符串发送以检查
  • @AndrewThompson 而不是...?你最好在说“不要那样做”的同时,说出要做什么。
  • 您提供的代码甚至无法编译。请显示实际代码,否则我们无法判断问题出在复制代码还是原始代码上。一个简短而完整的程序来演示这个问题将是理想的......
  • @VinceEmigh:是的,Stack Overflow 上有很多不好的问题。这不是添加更多内容的好理由 :) 如果您要发布代码,请确保这样做很有用。如果您认为发布可编译代码不值得花时间,请不要发布任何代码。 (当然,如果你想弄清楚为什么某些东西无法编译,则例外。)请参阅tinyurl.com/so-listtinyurl.com/so-hints,了解我对编写好问题的建议。

标签: java swing stream nullpointerexception client-server


【解决方案1】:

您正在通过char[] 呼叫toString()。这不会像你想的那样做——它会返回类似“[C@6af3a631”的东西,因为数组不会覆盖toString()。您最终会得到来自ObjecttoString() 的默认实现:

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。

可以使用:

// Eek - security problem!
out.writeObject(new String(passfield.getPassword());

...但这会在内存中留下一个字符串,然后无法清除。它还以明文形式传输密码,这很糟糕,除非此流以其他方式得到保护。

我怀疑你可以使用:

out.writeObject(passfield.getPassword());

它将char[] 作为一个对象传输,你会在另一端得到相同的char[]。但它并不能解决“传输密码”的问题 - 之后您仍然需要清除 char[] 以避免密码在内存中被访问。

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 2020-01-14
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多