【问题标题】:Client & Server java programs. How to detect the end of a transmission客户端和服务器 java 程序。如何检测传输结束
【发布时间】:2014-04-28 15:56:31
【问题描述】:

我有一个客户端程序和一个服务器程序。我发送 512 字节的数据包,我想发送一些文件。服务器如何知道传输何时完成?

我希望服务器程序在停止运行之前接收一些文件,并且我想区分它们。我想要做的是打印出收到的数据包数:

1号包已经收到

2号包已经收到

.

.

包号N已经收到

一旦我收到这个文件,我想把这个计数器变量设置为0,这意味着我必须检测一个文件何时被完全发送(这意味着接收不到512字节)。有没有办法计算从客户端程序接收到的字节数?最好的方法是什么?我正在使用字节数组。

【问题讨论】:

  • 你需要建立某种框架。
  • 您是否/必须使用 UDP 套接字? “数据包”的大小必须为 512 字节吗?如果改为使用 TCP,则会处理大量繁琐的工作,就像创建如此小的单个数据包的需要一样。 (使用 UDP,您还必须检测乱序或丢包等情况,并发出任何相关的重新请求。)

标签: java sockets byte


【解决方案1】:

最好的方法是引入分隔符。这将成为您协议的一部分。

当您发送文件时,您会发送数据。当没有更多字节要发送时,客户端将向服务器发送一个END_OF_MESSAGE 值,表示没有更多数据要发送,然后在您的代码中,您会得到类似的内容:

String END_OF_MESSAGE = "ENDOFMESSAGE";

if(input.equals(END_OF_MESSAGE)) {
    // You know the client has finished their transmission.
}

注意:我会让END_OF_MESSAGE 的值比这复杂得多。这只是为了演示目的。

编辑

正如 JB Nizet 建议的那样,另一种选择是先发送文件的长度。这样,当传输的字节数等于或大于预设大小时,服务器就会知道传输何时完成。

【讨论】:

  • 这远不是最好的方法。如果文件包含“ENDOFMESSAGE”,你会怎么做?为什么不简单地先发送文件的长度,然后发送文件?
  • 这是一个选项,但如果您注意到我在底部放置的文本,我解释说“ENDOFMESSAGE”仅用于示例目的,那么文件的内容应该不是问题.用户还可以发送文件的长度,这是我将在编辑中包含的内容。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2016-09-23
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多