Java TCP:读/写POJO

Java TCP:读/写POJO,java,tcp,io,pojo,Java,Tcp,Io,Pojo,我必须通过只连接一次的TCP传输POJO。我正在使用下面的代码发送和接收数据 public static void sendPacket(DataPacket packet, OutputStream out) throws Exception { if (packet != null) { byte[] lenArray = new byte[2]; byte[] data = ReadAndWriteFileUtil.serializeObject(p

我必须通过只连接一次的TCP传输POJO。我正在使用下面的代码发送和接收数据

public static void sendPacket(DataPacket packet, OutputStream out) throws Exception {
    if (packet != null) {
        byte[] lenArray = new byte[2];
        byte[] data = ReadAndWriteFileUtil.serializeObject(packet);
        lenArray[0] = (byte) (data.length >>> 8);
        lenArray[1] = (byte) (data.length & 0xFF);

        byte[] serializedPacket = new byte[2 + data.length];

        System.arraycopy(lenArray, 0, serializedPacket, 0, 2);
        System.arraycopy(data, 0, serializedPacket, 2, data.length);

        System.out.println("Send Length: " + (serializedPacket.length-2));
        out.write(serializedPacket);
        //out.flush();
    }
}

public static byte[] receivePacket(InputStream in) throws Exception {
    byte[] buf = receivePacket(2, in);
    int length = ((buf[0] & 0xFF) << 8) + (buf[1] & 0xFF);

    System.out.println("Length: " + length);

    byte[] data = receivePacket(length, in);
    return data;
}

private static byte[] receivePacket(int length, InputStream in)
        throws Exception {
    int dataRec = 0;
    byte[] data = new byte[length];

    while (dataRec < length) { 
        long n = in.read(data);
        if (n < 0) {
            break;
        }
        dataRec += (int) n;
    }
    if(dataRec <= 0) {
        data = null;
    }
    return data;
}
publicstaticvoidsendpacket(DataPacket-packet,OutputStream-out)抛出异常{
if(数据包!=null){
字节[]lenArray=新字节[2];
byte[]data=ReadAndWriteFileUtil.Serialized对象(数据包);
lenArray[0]=(字节)(data.length>>8);
lenArray[1]=(字节)(data.length&0xFF);
byte[]serializedPacket=新字节[2+数据.length];
System.arraycopy(lenArray,0,序列化数据包,0,2);
System.arraycopy(数据,0,序列化数据包,2,数据.长度);
System.out.println(“发送长度:+(serializedPacket.Length-2));
out.write(序列化数据包);
//out.flush();
}
}
公共静态字节[]receivePacket(InputStream in)引发异常{
字节[]buf=接收数据包(2,in);

整数长度=((buf[0]&0xFF)您根本不应该读取单独的数据包,只需写入和读取对象即可。允许Java
ObjectOutputStream
ObjectInputStream
执行它们的操作job@Germann使用ObjectOutputStream和ObjectInputStream会增加对象的大小开销o be transfer.AFAIR您仍然可以提供自定义序列化/反序列化,并通过这样做避免大小开销。@Germann谢谢。成功了:)