通过数据报包发送数组的最佳方式是啥?
Posted
技术标签:
【中文标题】通过数据报包发送数组的最佳方式是啥?【英文标题】:What's the best way to send an array through Datagram Packets?通过数据报包发送数组的最佳方式是什么? 【发布时间】:2012-10-18 12:16:18 【问题描述】:假设我有一个字符串:Hello!
我必须这样做:
-
将字符串转换为字节数组
发送字节数组
将其转换回字符串(供以后使用)
这是我的代码...
//Sender
String send = "Hello!";
byte[] data = send.getBytes();
DatagramPacket packetOut = new DatagramPacket(data, data.length); //send blah blah
//Receiver
//blah blah receive it
String receive = new String(packetIn.getData()); //convert it back
对整数数组执行此操作的快速而优雅的方法是什么?
【问题讨论】:
【参考方案1】:对于 int[],您可以使用 ObjectOutputStream 进行序列化,但更快的方法可能是使用 ByteBuffer。
public static byte[] intsToBytes(int[] ints)
ByteBuffer bb = ByteBuffer.allocate(ints.length * 4);
IntBuffer ib = bb.asIntBuffer();
for (int i : ints) ib.put(i);
return bb.array();
public static int[] bytesToInts(byte[] bytes)
int[] ints = new int[bytes.length / 4];
ByteBuffer.wrap(bytes).asIntBuffer().get(ints);
return ints;
【讨论】:
为什么要将整数数组长度乘以4?编辑:因为每 32 位 int 一个字节是 8 位?只是为了确保浮点数乘以 4 而 long 是 * 8? 我假设您想保留 32 位int
的所有 4 个字节(4 * 8 位)。【参考方案2】:
我不知道这种方式有多优雅,但它会很快。使用 GSON 库将 Integers 数组转换为 String,然后将 String 转换为 Integer 数组。
import java.lang.reflect.Type;
import com.google.gson.Gson;
...
Gson gson = new Gson();
List<Integer> list = Arrays.asList(1,2,3);
//Sender
String send = gson.toJson(list);
byte[] data = send.getBytes();
DatagramPacket packetOut = new DatagramPacket(data, data.length); //send blah blah
//Receiver
//blah blah receive it
String receive = new String(packetIn.getData()); //convert it back
Type listType = new TypeToken<List<Integer>().getType();
List<Integer> list = gson.fromJson(receive, listType);
Gson 的性能较低,但它证明了快速使用是合理的。如果您使用不复杂的对象,例如 java.util.List
- 会很好。
您可以从那里获得 GSON jar:link: gson 1.7
顺便说一句,使用 GSON,您可以将任何类型的 Object 转换为 String,反之亦然。
【讨论】:
以上是关于通过数据报包发送数组的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章
通过 Python Google Cloud Function 发送电子邮件的最佳方式是啥?
通过 Internet 向开发人员发送应用程序错误和日志的最佳方式是啥?