Java 通过网络传输双[]类型

Java 通过网络传输双[]类型,java,networking,java-8,double,Java,Networking,Java 8,Double,我想通过网络传输double[]类型,然后设法将其传输回接收端的double[]。我不完全确定如何做到这一点。我尝试将收到的字符串转换为char[],然后将所有字符解析为double[]。然而,这并没有起到作用,这两个人有不同的数据。我需要这样做,为opencv制作一个网络协议,以便轻松地传输Mat 这就是数据的发送方式: private void send_info(int row,int col, double[] data) { //Convert data to Stri

我想通过网络传输double[]类型,然后设法将其传输回接收端的double[]。我不完全确定如何做到这一点。我尝试将收到的字符串转换为char[],然后将所有字符解析为double[]。然而,这并没有起到作用,这两个人有不同的数据。我需要这样做,为opencv制作一个网络协议,以便轻松地传输Mat

这就是数据的发送方式:

private void send_info(int row,int col, double[] data) {
        //Convert data to String, separated by : to indicate change
        //char[] sendit = data.toString().toCharArray();
        out.println("INF:ROW:"+row+":COL"+":"+col+":"+data);
}
这就是它的接收方式:

private void setInfo(String input) {
        input = input.trim();
        input=input.replace("INF:","");
        String inputs[] = input.split(":");
        System.out.println(inputs[1]);
        int row = Integer.parseInt(inputs[1]);
        int col = Integer.parseInt(inputs[3]);
        //double[] data = magic(inputs[4]);
        // What I need ^
        frame.put(row,col,data);
}

根本不要改变他们的信仰。浪费时间和空间。直接做就行了。要发送double[]double,请执行以下操作:

全文如下:

DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
double[] doubles = new double[dis.readInt()];
for (int i = i; i < doubles.length; i++)
{
    doubles[i] = dis.readDouble();
}

或者可以使用ObjectOutputStream.writeObject和ObjectInputStream.readObject一次写入和读取整个数组。或者您可以使用NIO和DoubleBuffer:left作为读者的练习。

根本不转换它们。浪费时间和空间。直接做就行了。要发送double[]double,请执行以下操作:

全文如下:

DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
double[] doubles = new double[dis.readInt()];
for (int i = i; i < doubles.length; i++)
{
    doubles[i] = dis.readDouble();
}
或者可以使用ObjectOutputStream.writeObject和ObjectInputStream.readObject一次写入和读取整个数组。或者您可以使用NIO和DoubleBuffer:left作为读者的练习。

作为NIO解决方案的附录:

发送 接收 很明显,接收端的缓冲区管理变得更加复杂,这是由于预先未知的双数组长度

如果我们想要减少传输数量,即避免仅对前四个字节执行不同的i/O操作,那么该方法会变得更加复杂:

final int DEFAULT_BUFFER_SIZE = 4096;

try(ServerSocketChannel ss=ServerSocketChannel.open()
        .bind(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
    SocketChannel ch=ss.accept()) {

    ByteBuffer bb=ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE);
    while(bb.position()<4) if(ch.read(bb)<0) throw new EOFException();
    bb.flip();
    int size=bb.getInt(), byteSize=size*Double.BYTES;
    if(bb.remaining()<byteSize) {
        if(bb.capacity()<byteSize) bb=ByteBuffer.allocateDirect(byteSize).put(bb);
        else bb.compact().limit(byteSize);
        while(bb.hasRemaining()) if(ch.read(bb)<0) throw new EOFException();
        bb.flip();
    }
    else bb.limit(bb.position()+byteSize);
    double[] doubles=new double[size];
    bb.asDoubleBuffer().get(doubles);
    return doubles;
}
但请注意,该格式与使用中的DataOutputStream创建的格式相同,因此您可以将NIO发送代码与旧的I/O接收代码结合起来……

作为NIO解决方案的附录:

发送 接收 很明显,接收端的缓冲区管理变得更加复杂,这是由于预先未知的双数组长度

如果我们想要减少传输数量,即避免仅对前四个字节执行不同的i/O操作,那么该方法会变得更加复杂:

final int DEFAULT_BUFFER_SIZE = 4096;

try(ServerSocketChannel ss=ServerSocketChannel.open()
        .bind(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
    SocketChannel ch=ss.accept()) {

    ByteBuffer bb=ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE);
    while(bb.position()<4) if(ch.read(bb)<0) throw new EOFException();
    bb.flip();
    int size=bb.getInt(), byteSize=size*Double.BYTES;
    if(bb.remaining()<byteSize) {
        if(bb.capacity()<byteSize) bb=ByteBuffer.allocateDirect(byteSize).put(bb);
        else bb.compact().limit(byteSize);
        while(bb.hasRemaining()) if(ch.read(bb)<0) throw new EOFException();
        bb.flip();
    }
    else bb.limit(bb.position()+byteSize);
    double[] doubles=new double[size];
    bb.asDoubleBuffer().get(doubles);
    return doubles;
}

但请注意,该格式与使用中的DataOutputStream创建的格式相同,因此您可以将NIO发送代码与旧的I/O接收代码组合在一起……

有什么不同?double的格式为IEEE 754;您应该能够以8字节块的形式进行可移植的读写操作。请注意,除了将数据转换为文本和返回文本的效率低下之外,您的方法无法与您的代码一起工作,因为发送的字符串看起来像INF:ROW:100:COL100:[D@17a34e61…有什么不同?double的格式是IEEE 754;您应该能够以8字节块的形式进行可移植的读写。请注意,除了将数据转换为文本和返回数据的效率低下之外,您的方法无法与您的代码一样工作,发送的字符串将是这样的,例如INF:ROW:100:COL100:[D@17a34e61…
final int DEFAULT_BUFFER_SIZE = 4096;

try(ServerSocketChannel ss=ServerSocketChannel.open()
        .bind(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
    SocketChannel ch=ss.accept()) {

    ByteBuffer bb=ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE);
    while(bb.position()<4) if(ch.read(bb)<0) throw new EOFException();
    bb.flip();
    int size=bb.getInt(), byteSize=size*Double.BYTES;
    if(bb.remaining()<byteSize) {
        if(bb.capacity()<byteSize) bb=ByteBuffer.allocateDirect(byteSize).put(bb);
        else bb.compact().limit(byteSize);
        while(bb.hasRemaining()) if(ch.read(bb)<0) throw new EOFException();
        bb.flip();
    }
    else bb.limit(bb.position()+byteSize);
    double[] doubles=new double[size];
    bb.asDoubleBuffer().get(doubles);
    return doubles;
}