一个接一个地传输各种文件 - java套接字

时间:2010-09-17 12:49:37

标签: java sockets file

我正在编写一个套接字服务器,当客户端请求时,服务器将一个接一个地发送一些文件。 我要传输file1,file2和file3。 如何在客户端知道file1是否已完成,file2是否已启动? 对于消息,我使用DELIMITER字符(\ r \ n)。我也应该将它用于文件吗?我不认为继续在文件内部查找DELIMITER是一个好主意。

我需要使用相同的TCP连接作为传输这些文件的消息。

3 个答案:

答案 0 :(得分:2)

基本上有两种方法可以做到这一点:

  • 使用文件分隔符,如果分隔符出现在文件内容中,则实现“转义”分隔符的机制。

  • 在发送文件之前发送文件的长度。

第一种方法要求发送端和接收端都检查每个传输文件的每个字节。第二种方法更好,因为它避免了这种情况。但是,它假定您可以在发送之前确定文件的长度...但情况可能并非总是如此;例如如果您正在动态生成文件,请将它们直接写入套接字流。

HTTP的“块编码”方案所体现的第二种方法有一个变种。 (感谢@BalusC提醒我。)这涉及拆分文件并将其作为一系列以“块大小”开头的“块”发送。与“尺寸+文件”方法相比,这有两个优点:

  • 发件人不需要事先知道文件大小。
  • 发送或接收方可以(给定合适的协议设计)取消/跳过发送一个文件并继续下一个文件。 (使用简单的“大小+文件”方法,协议无法支持此功能,因为发送方和接收方无法可靠地重新同步。)

答案 1 :(得分:1)

在文件内容之前发送文件长度。这样接收器就知道有多少字节属于哪个文件。

答案 2 :(得分:1)

您可以让接收端检测套接字的输入端是否为空,并向套接字输出端的发送方发送查询,而不是分隔符。如果只是延迟,发件人回复'发送文件X'并且接收知道继续等待。如果传输完成,发送方回复'传输完成(### bytes)',以便接收方知道准备好下一个文件。

它在文件之间添加了一个短暂的延迟,但这是一种使用相同套接字进行多次传输的简单方法,而无需使用需要转义的分隔符。