使用相同的tcpclient进行读/写并使其保持活动状态

时间:2012-03-01 11:42:19

标签: c# networking tcp network-programming

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

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

服务器(互联网):包含有时会更改的文件。接受传入的客户端,并保留该客户端的tcpclient对象。它永远不能直接与客户端连接,因为客户端位于多个路由器后面;这就是连接必须保持打开的原因。在进行更改时通知客户端。并且还检查每个客户端是否有同步成功消息。

问题:

  1. 如何在客户端和服务器端有效保持连接畅通?

  2. 当客户端想要通知服务器时会发生什么 同步过程是成功的,但与此同时服务器 通知客户新的更新..?

  3. 创建一个Tcpclient(客户端)并在整个程序中保留此对象是一个好习惯吗?当某些网络操作失败时,尝试再次连接此tcpclient对象?
  4. 我做了很多研究,但实际上找不到使用相同tcpclient的东西..

    顺便说一句:这是一个基于我之前帖子的新线程,是否提出了这个解决方案(重用tcpclient)(udp packet not coming through

    Greets Daan&提前感谢您的关注

3 个答案:

答案 0 :(得分:6)

  

如何在客户端和服务器端有效保持连接打开?

如果激活SO_KEEPALIVE

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

  

当客户端想要通知服务器同步过程成功时,会发生什么情况,但同时服务器会通知客户端有新的更新。?

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

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

  

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

您确定可以再次连接同一个客户端吗? IIRC无法使用Socket,同样适用于TcpClient

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

Heyup Daan。最近的networkComms.net提交已经解决了这个问题。如果检测到没有其他流量被发送,它通过每几秒发送一个字节来保持连接活动。如果你看看这个开源的C#网络通信库,从11行示例here开始,你可能比从头开始创建所有东西的速度快一些。