我正在实现一种FTP协议。
我有一台服务器正在运行。
我启动客户端,连接到服务器,然后发送GET file.txt
请求。
客户端解析命令,看到它是一个GET命令并启动一个服务器套接字。
服务器接收命令,并启动与客户端的数据连接,并开始在此连接上发送file.txt。
当服务器发送文件时,它会关闭客户端套接字(数据)。
当我想获取另一个文件时,该端口已被使用。我该如何防止这种情况?我应该为所有命令连接会话保持数据连接打开吗?在这种情况下,我的客户如何知道文件何时结束?
由于
答案 0 :(得分:2)
当套接字关闭时,它进入TIME WAIT
状态(see here for the possible TCP states),并且在套接字离开TIME WAIT
之前,没有其他套接字可以绑定到同一个地址/端口对,并且在CLOSED
州。
可以通过设置SO_REUSEADDR
套接字选项来解决这个问题,如果其中一个套接字在{{1}中,则允许两个套接字绑定到同一个地址国家。
答案 1 :(得分:1)
每次都需要打开套接字进行传输,因为服务器会在传输结束时将其关闭。 通过从FTP服务器读取状态代码(226或250)的响应,您将知道该文件已下载/上传 - 检查FTP服务器返回代码列表: https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes
答案 2 :(得分:-1)
在我的项目中,我使用apache-commons-net,
只需使用heartbeat命令保持命令连接处于活动状态,
和enter local passive mode
每次都要进行文件传输。
对你的情况原则是一样的,我建议发送
EPSV
在获取file.txt之前执行命令。