【问题标题】:How to read/write a 2d char array through a Socket?如何通过 Socket 读/写 2d 字符数组?
【发布时间】:2015-11-24 19:40:10
【问题描述】:

所以我正在编写一个局域网井字游戏。我将“板”存储为二维char 数组。我希望能够通过套接字发送和接收这个数组。我目前正在使用InputStreamOutputStream 发送单个字节。但是,我认为这不适用于发送数组。此外,这些流似乎只能发送int 类型的数据。有人可以向我解释如何使用 I/O 流通过套接字发送二维 char 数组。示例代码会很棒!谢谢。

当前代码:

public void communicate() {
    try {
        OutputStream os = client.getOutputStream();
        InputStream is = client.getInputStream();
    }

    while (gameOver == false) {
        char[][] board = new char[3][3];
        try {
            os.write(board); //this dosen't work, only sends non-array int types. 
        } catch (IOException e) {

            e.printStackTrace();
        }

    }
}

【问题讨论】:

  • 您需要序列化您的对象或使用 XML、JSON 或任何其他基于字符串的格式。
  • @PM77-1 好吧,我希望这不是唯一的方法,因为我不知道如何使用 XML 或 JSON。你确定吗?老实说,这似乎是一个相对简单的任务,Java 应该能够单独处理。我总是可以将 char 数组转换为其他类型的数组,例如 String 或 int,然后当它在另一端收到时,我可以将它改回来。
  • Array 是一个对象。如果您使用序列化,Java 将为您创建对象的字符串表示形式。见Storing and Reading Objects
  • @PM77-1 啊,好的,谢谢,我明白了,同时也找到了这个:stackoverflow.com/questions/14054828/…。你能给我写一个示例代码吗?这会有所帮助。

标签: java arrays sockets io char


【解决方案1】:

Java InputStreamOutputStream 类只处理读写byte(s)。您当然可以仅使用输入和输出流将字符数组写入字节。

public static char[][] readBoard(InputStream in) throws IOException {
    char[][] board = new char[3][3];
    for(int i=0;i<9;i++) {
        board[i/3][i%3] = (char) in.read();
    }
    return board;
}

public static void writeBoard(OutputStream out, char[][] board) throws IOException {
    for(int i=0;i<9;i++) {
        out.write(board[i/3][i%3]);
    }
}

您还可以使用ObjectOutputStreamObjectInputStream 通过流读取和写入对象。请注意,读取和写入这些流的类必须实现 Serializable 接口(您的 char[][] 可以使用)。

public static char[][] readBoard(InputStream in) throws IOException {
    ObjectInputStream ois = new ObjectInputStream(in);
    return (char[][]) ois.readObject();
}

public static void writeBoard(OutputStream out, char[][] board) throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(out);
    oos.writeObject(board);
}

【讨论】:

  • 好的,这正是我想要的。另外@PM 77-1 谢谢你,我想你说的是同样的话。我可能会采用第二种方式,因为单独发送/接收数组的每个字节似乎更清晰。顺便说一句,+1 巧妙地使用了 2D 数组的单个 for 循环。过去,我总是将 2 个嵌套的 for 循环用于 2D 数组。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
相关资源
最近更新 更多