2012-03-01 45 views
4

我有以下情况:
客户端 - >路由器 - >互联网 - >专用服务器

客户:启动时,连接到服务器,并保持连接打开。偶尔会从服务器接收文件更改的通知。开始一个同步过程,然后通知服务器这是否成功。有时可能会失去联系,因此必须建立新的联系。

服务器(互联网):包含有时会更改的文件。接受传入的客户端,并保留该客户端的tcpclient对象。它不能直接与客户端连接,因为客户端位于几台路由器后面;这就是连接必须保持开放的原因。通知客户更改时间。并且还为每个客户端检查同步成功消息。使用读/写相同的TcpClient,并保持它活着

问题:

  1. 如何有效地保持我的连接上的客户端和服务器端的开放?

  2. 当客户想通知 同步过程是成功的,但在此期间,服务器 通知客户端有新的更新。该服务器会发生什么?

  3. 在整个程序中创建一个Tcpclient(客户端)并保持此对象是否是一种很好的做法?当某些网络操作失败时,请尝试再次连接这个tcpclient对象?

我做了很多的研究,但不能真正找到的东西,保持使用相同的TcpClient ..

顺便说一句:这是根据我以前的帖子一个新的线程,是该解决方案(重用的TcpClient )提出了(提前udp packet not coming through

招呼大安&感谢您的关注

回答

6

如何有效地保持我的连接的客户端和服务器上打开一面呢?

TCP 发送可以发送保持活动消息每默认如果激活SO_KEEPALIVE。但它可以发送自己的保活消息是一个好主意(以防止路由器等空闲连接断开)

当客户想以通知同步过程是成功的服务器会发生什么,但在同时服务器通知客户端进行新的更新..?

设计您的协议,使其具有请求ID,并且可以在通知和回复之间有所不同。

将您的API设计为同步,但使用异步套接字处理。

在整个程序中创建一个Tcpclient(客户端)并保持这个对象是一个好习惯吗?当某些网络操作失败时,请尝试再次连接这个tcpclient对象?

您确定可以再次连接到同一个客户端吗? IIRC它不可能与SocketTcpClient相同

我会使用相同的客户端,只要它没有断开连接。

+0

如果您引用SO_KEEPALIVE套接字选项,则默认情况下它未启用。如果启用,默认超时通常按照每两小时一次保持活动消息的顺序。 TCP没有其他保活机制。 – 2012-03-01 11:58:33

+0

@JoachimPileborg:谢谢。我以为它默认是开启的。 – jgauffin 2012-03-01 12:01:25

+0

那么......你怎么激活那个套接字选项? – Nyerguds 2013-06-25 10:30:21

3
  1. 要确保连接保持打开状态,并且客户端和服务器之间没有网络故障,您可以向协议添加两条消息:保持活动状态并保持活动答复。无论是客户端还是服务器(由您决定)都会定期发送保持活动消息(每分钟一次),另一端则回复保持活动状态。如果发送保持活动消息的发送者在发送下一个保持活动消息时没有收到回复,则可以认为该连接失效并关闭连接。另一端,发送回复的人需要一个计时器。如果在指定的时间内未收到保活请求,则应关闭连接。
  2. 客户端只是让来自服务器的通知排队,并在可能时处理它们。要么增加客户端中的接收缓冲区(setsockoptSO_RCVBUF),要么保留自己的队列。要跟踪哪个“同步完成”消息符合哪个“同步”消息,您必须在消息中添加某种消息标识符。这可以是一个简单的整数值,它会开始一个零,然后服务器为每个“do-sync”消息增加一个值。
  3. 只要你有一个工作连接,保持连接对象。当重新连接的时候,我会创建一个新的连接对象,以保证安全。但它可能会重用旧的,我不太了解C#和.NET库。
0

Heyup Daan。此问题已在最近的networkComms.net提交中得到解决。如果检测到没有其他流量正在发送,它会每隔几秒发送一个字节来使连接保持活动状态。如果您看一下这个开源的C#网络通信库,从11行示例here开始,您可能会比从头开始创建所有内容更快一些。