繁体   English   中英

获取围绕Socket.getOutputStream编写的DataOutputStream的字节数

[英]get number of bytes a DataOutputStream wrapped around Socket.getOutputStream wrote

我有一个服务器客户端应用程序并使用Java套接字API。

服务器将通过调用DataOutputStream的write(bytes[] b)向客户端发送字节,DataOutputStream直接包含在client.getOutputStream (此处没有Buffer)。

这是一个文件下载功能我将支持简历,我没有在这里使用任何HTTP,我已经实现了我自己的简单协议。

我在SO上看过这些问题:
1- 问题1
2- C#问题
3- FileChannel问题

第一个没有回答我的问题,我不能将DataOutputStream包装在ByteArrayOutputStream周围,因为后者不能包裹在client.getOutputStream ,我不知道如何实现我自己的write(int i)方法(并且不要我想使用JNI)。

第二个是C#而不是java(无论如何它都在调用WIN API,顺便说一下我是linux用户:))。

第三个是谈论FileChannels和HTTP,正如我所说我没有使用HTTP而我正在使用java Socket的API。

那么如何获得实际写入的字节数?

PS(编辑)

通过恢复支持,我的意思是我将让客户端能够在特定字节停止下载,然后一段时间(分钟,小时,天,等等)他/她可以从它离开的地方继续下载。

  • write(int c)的byes数是1。

  • write(bye[] buffer)的字节数由buffer.length给出。

  • write(bye[] buffer, int offset, int length)的字节数由length给出。

正如它在Javadoc中所说的那样。

将数据写为字节数组时,也要写入数据的大小。 读取数据时,请读取大小并构造字节数组。

我更喜欢并使用这种方法发送大文件(> 10 MB),包括从客户端到服务器的图像。 通过预先写入大小,您知道从byte []读取多少字节

有看这一个这篇文章 ,以文件转换为字节[]和回

/*  Convert File to byte[] msgBytes */


/* Write byte array */
OutputStream out = socket.getOutputStream(); 
DataOutputStream dos = new DataOutputStream(out);
int length = msgBytes.length;// it is byte array of message to be sent
dos.writeInt(length);
if (length > 0) {
    dos.write(msgBytes);
}

/*Read byte array */
DataInputStream dis = new DataInputStream(socket.getInputStream());
int length = dis.readInt();                   
if(length>0) {
    byte[] msgBytes = new byte[length];
    dis.readFully(msgBytes, 0, length); 
}

/* Now you can convert byte array back to File*/

编辑:(恢复下载,当我回答时,这不是原帖的一部分)

  1. 保存您在客户端从服务器读取的字节数(使用inputStream.read()而不是inputStream.readFully()

  2. 重新连接到服务器时跳过该值(bytesAlreadyRead)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM