通过流接收时,对象显示而不是String

时间:2014-01-22 11:03:53

标签: java swing stream nullpointerexception client-server

希望我不需要使用我的代码来填充此帖子,但如果需要,请询问。 另外,我只使用getPassword().toString()进行测试,我不会在任何应用程序中使用它。

客户端: 从JPasswordField passfield获取密码,通过ObjectOutputStream out

将其作为字符串发送

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

很简单,但我遇到的问题是它不是显示String,而是打印一个对象([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

有关。

这是帮助我理解更大问题的一小步(包含密码的数据包发送得很好,收到的数据包很好,但密码var以null形式出现)。

1 个答案:

答案 0 :(得分:2)

您正在toString()上致电char[]。这不符合您的想法 - 它将返回类似“[C @ 6af3a631”的内容,因为数组不会覆盖toString()。您最终得到toString()的默认实施Object

  

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

可以使用:

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

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

我怀疑你可以使用:

out.writeObject(passfield.getPassword());

char[]作为对象传输,您将在另一端获得相同的char[]。它虽然没有解决“传输密码”的问题 - 然后你仍然需要清除char[]以避免在内存中访问密码。