当前位置:  开发笔记 > 编程语言 > 正文

TcpClient与服务器通信以保持c#中的活动连接?

如何解决《TcpClient与服务器通信以保持c#中的活动连接?》经验,为你挑选了1个好方法。

我有这个TcpClient代码,工作正常.它连接到Linux系统上的perl服务器并接收服务器发送给它的任何东西.很好地工作.

 public static void Main() {
         foreach (ProtocolConnection tcpConnection in TcpConnectionsList) {
                ProtocolConnection connection = tcpConnection;
                ThreadPool.QueueUserWorkItem(_ => {
                                                 ThreadTcpClient(connection);
                                                 ManualResetEventTcp.Set();
                                             });
         }
         ... Some code...      
 }

 public static void TcpConnect(ProtocolConnection varConnection) {
        int retryCountSeconds = varConnection.RetryEverySeconds*Program.MilisecondsMultiplier;
        int count = 0;
        while (true) {

            try {
                using (var client = new TcpClient(varConnection.IpAddress.ToString(), varConnection.Port) { NoDelay = true })
                using (var stream = client.GetStream()) {
                    var data = new Byte[256];
                    while (!Program.PrepareExit) {
                        Int32 bytes = stream.Read(data, 0, data.Length);
                        string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();
                        if (varReadData != "" && varReadData != "PONG") {
                            VerificationQueue.EnqueueData(varReadData);
                            Logging.AddToLog("[TCP][" + varConnection.Name + "][DATA ARRIVED]" + varReadData);
                        } else {
                            Logging.AddToLog("[TCP]" + varReadData);
                        }
                    }
                }
            } catch (Exception e) {
                if (e.ToString().Contains("No connection could be made because the target machine actively refused it")) {
                    Logging.AddToLog("[TCP][ERROR] Can't connect to server (" + varConnection.Name + ") " + varConnection.IpAddress + ":" + varConnection.Port );
                } else {
                    Logging.AddToLog(e.ToString());
                }

            }
            DateTime startTimeFunction = DateTime.Now;
            do {
                Thread.Sleep(1000);
            } while (((DateTime.Now - startTimeFunction).TotalSeconds < retryCountSeconds));
        }
    }

但是在某些条件下我遇到了一些问题:

    我的工作经常连接滴一些空闲时间,所以我在服务器已经实现,所以当它收到PING它PONG回应后连接.我可以用UDP发送PING服务器,它会与PONG回应的TCP但我宁愿内置的方式进入TCP客户端,以便它发送Ping每60秒左右.即使UDP的解决方案是可以接受我有没有超时string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();,所以当PONG没有到达我的客户甚至不反正注意到它.它只是在等待...这让我...

    我的另一个问题是,在某些时候,string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();这一直在等待数据.当服务器崩溃或断开我的客户端时,我甚至都没有注意到.我希望服务器有某种timeout或检查连接是否有效.如果它不活动,它应该尝试重新连接.

修复此TcpClient最简单的方法是什么?如何实现二者双向通信确保如果服务器断开连接,我的还是我的网络断开连接的客户端会注意到这一点,并重新建立连接?



1> nos..:

这不是Encoding.ASCII.GetString(data, 0, bytes).Trim();永远的阻塞,它是 stream.Read() 如果你正在阅读,你不能轻易区分服务器(或中间的任何NAT网关)丢弃你的连接,以及服务器根本没有任何东西发送你的情况.如果TCP FIN/RST数据包在发生故障时未到达您的客户端,或者NAT网关静默丢弃您的连接,则至少应该这样做.

你可以做什么;

设置发送/ 接收时间,并在发生超时时ping服务器,或通过TCP连接实现自己的心跳消息.如果您在合理的时间内没有收到心跳,请重新建立或采取其他措施.

设置TCP keepalive选项,并依赖它来告诉您服务器是否已经消失.见代码在这里.

最后一点将告诉你tcp连接是否失败,它不会告诉你服务器是否有一些失败 - 例如,如果你CTRL + Z你的perl服务器,它只会坐在那里没有做任何事情,因为tcp窗口关闭,因此,如果需要,您可能需要实施自己的热量消息来覆盖这种情况.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有