【发布时间】:2016-02-23 20:31:35
【问题描述】:
我有一个服务器-客户端应用程序并使用 java Sockets API。
服务器会通过调用DataOutputStream的write(bytes[] b)向客户端发送字节,DataOutputStream直接包裹在client.getOutputStream上(这里没有Buffer)。
这是一个文件下载功能并且我将支持简历,我在这里没有使用任何HTTP,我已经实现了我自己的简单协议。
我在 SO 上看到了这些问题:
1-question1.
2-C# question.
3-FileChannel question。
第一个没有回答我的问题,我不能将 DataOutputStream 包裹在 ByteArrayOutputStream 周围,因为后者不能包裹在 client.getOutputStream 周围,而且我不知道如何实现我自己的 write(int i) 方法(并且不要不想使用 JNI)。
第二个是 C# 而不是 java(无论如何它都在调用 WIN API,顺便说一句,我是 linux 用户 :))。
第三个是关于 FileChannels 和 HTTP,正如我所说的,我没有使用 HTTP,我使用的是 java Socket 的 API。
那么如何获取实际写入的字节数?
PS(编辑)
通过恢复支持,我的意思是让客户端能够在特定字节处停止下载,然后在一段时间(几分钟、几小时、几天等)之后,他/她可以从它离开的地方继续下载。
【问题讨论】:
-
对你来说是透明的。一旦你调用
socket.read(bytes),它还会返回读取了多少字节。看这个例子:http://stackoverflow.com/a/19863726/3710490 -
@Valijon 我知道
socket.read(bytes)返回读取了多少字节,但socket.write(bytes)返回无效而不是写入了多少字节,假设客户端决定停止下载,那么服务器如何知道那个? -
因为你的连接是TCP,你写的就是你的客户端读的!
-
@Valijon 错了。由于他的套接字发送缓冲区和阅读器的套接字接收缓冲区,作者可能比阅读器领先许多 KB。