我正在编写一个套接字服务器,当客户端请求时,服务器将一个接一个地发送一些文件。 我要传输file1,file2和file3。 如何在客户端知道file1是否已完成,file2是否已启动? 对于消息,我使用DELIMITER字符(\ r \ n)。我也应该将它用于文件吗?我不认为继续在文件内部查找DELIMITER是一个好主意。
我需要使用相同的TCP连接作为传输这些文件的消息。
答案 0 :(得分:2)
基本上有两种方法可以做到这一点:
使用文件分隔符,如果分隔符出现在文件内容中,则实现“转义”分隔符的机制。
在发送文件之前发送文件的长度。
第一种方法要求发送端和接收端都检查每个传输文件的每个字节。第二种方法更好,因为它避免了这种情况。但是,它假定您可以在发送之前确定文件的长度...但情况可能并非总是如此;例如如果您正在动态生成文件,请将它们直接写入套接字流。
HTTP的“块编码”方案所体现的第二种方法有一个变种。 (感谢@BalusC提醒我。)这涉及拆分文件并将其作为一系列以“块大小”开头的“块”发送。与“尺寸+文件”方法相比,这有两个优点:
答案 1 :(得分:1)
在文件内容之前发送文件长度。这样接收器就知道有多少字节属于哪个文件。
答案 2 :(得分:1)
您可以让接收端检测套接字的输入端是否为空,并向套接字输出端的发送方发送查询,而不是分隔符。如果只是延迟,发件人回复'发送文件X'并且接收知道继续等待。如果传输完成,发送方回复'传输完成(### bytes)',以便接收方知道准备好下一个文件。
它在文件之间添加了一个短暂的延迟,但这是一种使用相同套接字进行多次传输的简单方法,而无需使用需要转义的分隔符。