套接字编程最佳实践?

时间:2012-02-01 12:10:04

标签: sockets tcp

我正在设计文件同步应用程序(如DropBox)。客户端在端口443上与服务器保持持久的安全(SSL)TCP套接字。无论何时在客户端上创建/更改/删除文件,包含相关数据的数据包都通过套接字发送到服务器,服务器将其处理为更新服务器上的文件。类似地,当服务器上的某些内容发生变化时,它会将相关数据发送到客户端,然后客户端会更新本地副本。

当服务器位于本地计算机或本地LAN上时,此功能完全正常。我担心的是当客户端处于不可靠的网络时。 所以我的问题是在设计此类应用时需要考虑的最佳做法和问题是什么?

例如,假设在客户端上创建文件时,客户端是仅将数据发送到服务器并忘记它,还是应该在某个时间段内等待服务器的确认,否则发送再次提供数据?什么样的承认?

3 个答案:

答案 0 :(得分:5)

TCP抽象出许多网络问题:如果服务器不确认收到数据包,数据包总是按顺序到达并重新发送。不可靠的网络将导致流量变慢,因为必须重新发送数据包。

如果连接丢失了,你的read()和write()调用将返回错误返回值,所以你必须处理它。

答案 1 :(得分:0)

  

客户端与服务器保持持久的安全(SSL)TCP套接字

     

[..]

     

客户端应该只是将数据发送到服务器并忘记它,还是应该在某个时间段内等待服务器的确认,否则会再次发送数据?

如果您使用UDP,则必须这样做。但是既然你正在使用TCP,那就已经为你完成了。

http://en.wikipedia.org/wiki/Transmission_Control_Protocol

您应该知道TCP是一种面向流的协议,因此您的数据可能无法以您发送的方式到达(即,它可能一次到达一个字节,或者一次到达)。

答案 2 :(得分:0)

即使服务器是localhost,您也应该使用确认。想象一下,发送信息时会出现某种连接问题。您需要某种方式来了解操作的结果(例如,使用确认系统)。

我会使用比简单的ACK / NACK回复更复杂的东西。例如,如果更改客户端中的某些文件,则在从客户端向服务器发送信息后,服务器应回复受更新操作影响的文件的编号(或具有名称的列表)。通过这种方式,客户端可以验证一切正常,或者行动结果。