0

我的输出是“[B@b42cbf”,没有错误。

它应该是一个字符串,上面写着“服务器检查”。

如何修复我的代码以输出字符串而不是地址?

我打印对象的代码已经更改了几次,但现在如下。

System.out.println(packet.getMessage().toString());

我的数据包类如下。

import java.io.Serializable;

public class Packet implements Serializable {

    final public short MESSAGE = 0;
    final public short COMMAND = 1;

    private String _ip;
    private short _type;
    private String _source;
    private String _destination;
    private byte[] _message;


    public Packet(String ip, short type, String source, String destination,
            byte[] message) {
        this._ip = ip;
        this._type = type;
        this._source = source;
        this._destination = destination;
        this._message = message;
    }

    public String getIP() {
        return this._ip;
    }

    public Short getType() {
        return this._type;
    }

    public String getSource() {
        return this._source;
    }

    public String getDestination() {
        return this._destination;
    }

    public byte[] getMessage() {
        return this._message;
    }
}

我通过 ObjectOutputStream 发送数据包并在 ObjectInputStream 中接收它。用(Packet)将该对象覆盖到一个数据包中。您可以看到它是如何工作的,如下所示。

public void sendPacket(Packet packet) throws NoConnection {
        if (this._isConnected) {
            try {
                this._oos.writeObject(packet);
                this._oos.flush();  // Makes packet send
            } catch (Exception e) {
                e.printStackTrace();
                this._isConnected = false;
                throw new NoConnection("No notification of disconnection...");
            }
        } else {
            throw new NoConnection("No connection...");
        }
    }

这里是听者。

@Override
    public void run() {
        try {
            this._ois = new ObjectInputStream(this._socket.getInputStream());
            Packet packet = (Packet) this._ois.readObject();
            this._listener.addPacket(packet);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
4

3 回答 3

9

[B@b42cbf是您打印字节数组时得到的,即二进制数据。

要从中获取字符串,您需要知道编码,然后您可以执行以下操作:

String messageStr = new String(packet.getMessage(), "UTF-8");

当然,这仅在该数据实际上是可打印数据时才有效。

于 2011-12-21T08:28:30.703 回答
2

getMessage()返回一个字节数组。数组的toString()方法不会打印其内容。您可以改为getMessage()return a 。String

于 2011-12-21T08:30:48.420 回答
1

这是正常的,您将数组对象打印为字符串。

用途:System.out.println(new String(packet.getMessage());

也就是说,用其中的字节构建一个字符串。请注意,这使用默认编码。

于 2011-12-21T08:29:36.370 回答