Java中通过TCP发送int或byte数组的性能?

Java中通过TCP发送int或byte数组的性能?,java,arrays,tcp,integer,client-server,Java,Arrays,Tcp,Integer,Client Server,我正在用H264视频文件实现clien服务器流媒体应用程序 我使用BufferedInputStream读取H264文件,如下所示: BufferedInputStream bis = new BufferedInputStream(p.getInputStream()); int read = bis.read(); 并使用DataOutputStream通过TCP发送流数据 DataOutputStream dataOutputStream = new DataOutputStream(

我正在用
H264
视频文件实现clien服务器流媒体应用程序

我使用
BufferedInputStream
读取
H264
文件,如下所示:

BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
int read = bis.read();
并使用
DataOutputStream
通过TCP发送流数据

 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
当我从
BufferedInputStream:read()
读取流数据时,它返回
int

我不确定是否应该以
int
的形式发送流式数据,或者最好先将其转换为
byte[]
数组,然后通过TCP发送
byte
数组

 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
我选择TCP以确保可靠性(不会丢失视频帧)


在通过TCP发送
int
byte[]
之间,哪一种性能更好?简单地说,哪一个发送和接收速度更快?

当使用返回int的
read()
方法时,它仍然只返回一个字节的数据。它不像是接收到发送的完整的4字节int。Javadoc解释了返回类型为int(即使它接收到一个字节)的原因。它通过返回
-1
而不是(0-255)字节值来表示-(流/文件/等)的结束。当您实际发送一个int时(我不知道如果没有
DataOutputStream
),您将收到4个字节

关于性能:根据经验,网络比CPU慢几个数量级,所以面向字节的方法和面向数组的方法之间没有明显的区别(只要双方都使用缓冲策略)


[编辑]但是,在发送BLOB(二进制大对象)的情况下,使用数组是您所期望的,因此如果使用数组,其他程序员(以及未来的您)将更好地理解代码。

当然,我使用
DataOutputStream
发送流数据。因此,当我发送一个int(在上面代码示例中的
read
变量中)时,如
DataOutputStream::write(read)
DataOutputStream::writeByte(read)
,客户端仍然会收到包含视频帧的4个字节?否。这两种方法都会写入一个字节。因此,客户端将只接收一个字节。阅读javadocs!(如果您的代码不正确,因为您不了解标准API,那么不管它有多快。)
DataOutputStream
没有“当然”。它是一个可选类,专门用于序列化不同的Java原语和UTF-8字符串(字符串是一个奇怪的Java“原语”)。当你只发送字节流(比如你的例子中的视频)时,你通常不会使用它。我浏览了一下你的代码,没有注意到你实际使用了
DataOutputStream
。通常,当你包装一个原始流时,你会将它包装在
BufferedOutputStream
中,所以我的眼睛错误地认为它看到了。