2016-08-24 42 views
-1

我有一个2D动态数组包含整数和字符串,我需要发送到服务器。该阵列包含100,000列。一种可能性是将数组复制到文件中并将其发送到服务器,服务器可以解析它。而另一种可能性是做序列化。我正在做socket编程,我正在寻找的解决方案应该是最佳的。考虑到数组的大小,我不认为将每个元素转换为字节会很好。请你能给我一些提示或指导我如何着手。如何通过套接字发送一个2D阵列到Java服务器

+2

“应该是最优的”以什么方式优化?速度?安全?可靠性?你尝试过什么吗?就目前而言,问题太广泛了! – Burkhard

+0

在速度方面 – Shahzaib

+0

根据网络的速度和质量,压缩流可能会有用。再次请添加一些细节! – Burkhard

回答

0

将数据序列化为字节以通过套接字进行流式传输,或将数据序列化为文件以及发送文件基本上是一回事。如果您序列化到一个文件,您可以使用FTP等已建立的协议,这对于一个刚接触套接字的开发人员来说更容易。

然而,再次意识到它们本质上是同一个问题。将编程对象分解为字节以写入输出流。

编辑:

根据您的字符串的内容,使用zip压缩算法是一个不错的选择。字符串中的重复内容越多,您获得的压缩比就越高。以下仅是一个示例文件格式:

  • 要输入的整数数量。 (因为你没有在你的二维数组中给出最大的ROWS,所以我不能说这需要多少字节,我们假定它的8个字节。)
  • 所有整数。这将需要3 * NUM_INTS个字节。
  • 拉链压缩的字符串,用空格分隔。

我在这里做了很多假设,因为您的问题还没有足够具体,或者您给出的任何答复。

+0

现在,问题是,我们在谈论什么类型的文件? – Shahzaib

+0

这取决于你有什么类型的数据。你的整数的范围是什么?这个文件是否需要被人类消费?你的琴弦有多久了? @Shahzaib –

+0

整数由6位数字组成,字符串由10个字符组成 – Shahzaib

0

我会将它转换为json或xml并发送它。在速度方面不是最有效的解决方案,而是最便携的解决方案。

+1

CSV也不错。 –

+0

这似乎是一个很好的建议......让我考虑一下 – Shahzaib

0

一个简单的方法是使用一个DataOutputStream并将它环绕您使用的插座:DataOutputStream dOut = new DataOutputStream(socket.getOuputStream())

然后,您可以只建立自己的简单的二进制协议这样的(它是一个一维数组,但它可以很容易地扩展为二维数组工作以及):如果你想优化

//first write the amount of elements in the array 
dOut.write(array.length()); 

//now write every element  
for (Object obj : array) { 
    if (obj instanceof Integer) { 
     dOut.writeByte(0); //0 = Integer 
     dOut.writeInt((Integer) obj); 
    } else 
     if (obj instanceof String) { 
      dOut.writeByte(1); //1 = String 
      dOut.writeUTF((String) obj); //UTF-8 encoded String 
     } 
     // ... 
} 

对于数据大小,则还可以在套接字的OutputStreamDataOutputStream之间使用GZIPOutputStream,如下所示:new DataOutputStream(new GZIPOutputStream(socket.getOutputStream()))。当然,你必须在服务器端解压它才能工作。

+0

所以基本上,我们将解析数组中的每个元素并将其写入服务器。这不会带来太多的网络流量?换句话说,速度会降低。 – Shahzaib

+0

这基本上是一个序列化协议。除了解析它是什么类型的对象并且为每个元素浪费了一个字节以便稍后将它们分开之外,这是最佳的。如果你想要更多的速度和更少的数据,那么我建议分离这些对象并将它们分别放入不同的数组中 - 所以整数进入一个int数组,而Strings进入一个String数组。 – Entrusc

+0

此外,GZIP压缩会塑造掉一些流量(当然是换取性能)。特别是如果你的阵列中有很多相近的物体靠近。 – Entrusc

相关问题