Java UDP - 从服务器向客户端发送字符串数组

时间:2017-09-12 09:34:51

标签: java arrays compiler-errors

嗨,谢谢你,

所以我试图获取一个JList项目数组并将它们转换为字符串数组(我认为我已经做对了),然后我尝试发送该字符串数组然后我的客户将尝试将它们显示回到他们一边的JList中。

我尝试了一些不同的东西,但没有一个在起作用。

这是我最近尝试发送字符串数组的代码:

String[] FilesList = (String[]) lClient1Files.getSelectedValues();

FilesBuffer = FilesList.getBytes();

DatagramPacket DGPFilesResponse = new DatagramPacket(FilesBuffer,FilesBuffer.length, DGP.getAddress(), DGP.getPort());
SeederSocket.send(DGPFilesResponse);

FilesBuffer = FilesList.getBytes();导致问题,因为此处getBytes()不适用。

所以我的问题是: 1)如何将JList项目数组(它们是名称)发送到客户端(它不必特别是字符串数组),以及 2)我如何在客户端收到列表,以便我可以使用它?

谢谢。

2 个答案:

答案 0 :(得分:2)

必须为字符串数组制作二进制格式。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (DataOutputStream dos = new DataOutputStream(baos)) {
    dos.writeInt(filesList.length);
    for (String files : filesList) {
        dos.writeUTF(files);
    }
}
byte[] bytes = baos.toByteArray();

String内部首先写入字节长度,并使用String.getBytes("UTF-8"),因此可以写入任何字符串。

阅读与反向输入类一起使用。

如果你想在那里有很多客户,可能有不同的版本, 然后在消息中添加版本号码。

另一方面

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
try (DataInputStream dis = new DataInputStream(baos)) {
    int stringsCount = dis.readInt();
    String[] filesList = new String[stringsCount];
    for (int i = 0; i < stringsCount; ++i) {
        filesList[i] = dis.readUTF();
    }
    return filesList;
}

答案 1 :(得分:0)

UDP有效负载必须是byte[]。您需要选择一种方法将数据编码为byte[],以便可以在接收端将其转换回来。

所以你需要写encode()decode()以便像这样的单元测试工作:

 @Test
 public void encodesAndDecodesStringArray() {
     String[] strings = new String[] { "foo", "bar" };
     byte[] encoded = Encoder.encode(strings);
     String[] decoded = Encoder.decode(encoded);

     assertThat(decoded, is(strings));
 }

您可以选择数百种编码方案。分隔符分隔,长度分隔,JSON,XML,BSON,ASN.1 ......看一下维基百科的List of data serialization formats

可能对您有用的一个非常简单的选项是分隔符分隔:

public byte[] encode(String[] strings) {
    return String.join(",", strings).getBytes(UTF_8);
}

public String[] decode(byte[] encodedArray) {
    return new String(encodedArray, UTF_8).split(",");
}

但请注意,如果任何输入字符串包含“,”(或您选择的任何分隔符),则此基本方案将失败。选择适合您的方案。

考虑使用JSON - 有易于使用的库来读写JSON。网络跟踪中的可读ASCII通常很方便。空间开销不是那么高。它已经为任意复杂的分层数据结构做好了准备。

考虑一下,如果您更改发件人生成的数据结构,接收方也必须更改。如果这很重要,请考虑将协议版本编码为您发送的内容(可能只需说“前两个字节是版本”,并始终在其中粘贴0x0001)。