我有以下情况:
客户 - >路由器 - >互联网 - >专用服务器
客户端:启动时,连接到服务器并保持连接打开。偶尔从服务器接收文件更改的通知。启动同步过程,然后通知服务器是否成功。有时可能会失去连接,因此必须建立新的连接。
服务器(互联网):包含有时会更改的文件。接受传入的客户端,并保留该客户端的tcpclient对象。它永远不能直接与客户端连接,因为客户端位于多个路由器后面;这就是连接必须保持打开的原因。在进行更改时通知客户端。并且还检查每个客户端是否有同步成功消息。
问题:
如何在客户端和服务器端有效保持连接畅通?
当客户端想要通知服务器时会发生什么 同步过程是成功的,但与此同时服务器 通知客户新的更新..?
我做了很多研究,但实际上找不到使用相同tcpclient的东西..
顺便说一句:这是一个基于我之前帖子的新线程,是否提出了这个解决方案(重用tcpclient)(udp packet not coming through)
Greets Daan&提前感谢您的关注
答案 0 :(得分:6)
如果激活如何在客户端和服务器端有效保持连接打开?
SO_KEEPALIVE
, TCP 发送可以发送保持活动消息默认。但是发送自己的保持活动消息(防止路由器中的空闲连接断开等)是个好主意
当客户端想要通知服务器同步过程成功时,会发生什么情况,但同时服务器会通知客户端有新的更新。?
设计您的协议,使其具有请求ID,并且可以在通知和回复之间有所不同。
将您的API设计为同步,但使用异步套接字处理。
创建一个Tcpclient(客户端)并在整个程序中保留此对象是一个好习惯吗?当某些网络操作失败时,尝试再次连接此tcpclient对象?
您确定可以再次连接同一个客户端吗? IIRC无法使用Socket
,同样适用于TcpClient
我会使用同一个客户端,只要它没有断开连接。
答案 1 :(得分:3)
setsockopt
和SO_RCVBUF
)中增加接收缓冲区,也可以保留自己的队列。要跟踪哪个“同步完成”消息适合哪些“同步”消息,您必须在消息中添加某种消息标识符。这可以是一个简单的整数值,它从零开始,然后服务器为每个“do-sync”消息将其增加一个。答案 2 :(得分:0)
Heyup Daan。最近的networkComms.net提交已经解决了这个问题。如果检测到没有其他流量被发送,它通过每几秒发送一个字节来保持连接活动。如果你看看这个开源的C#网络通信库,从11行示例here开始,你可能比从头开始创建所有东西的速度快一些。