一段时间后无法连接到服务器

时间:2019-05-13 03:51:50

标签: c# .net asyncsocket

客户:

public class TCPClientWrapper : IDisposable
{
    private TcpClient tcpClient;
    private readonly string address;
    private readonly int port;

    public TCPClientWrapper(string address, int port)
    {
        tcpClient = new TcpClient();
        this.address = address;
        this.port = port;
    }

    private void TryConnect()
    {
        tcpClient = new TcpClient();
        tcpClient.SendTimeout = 15;
        bool isConnected = false;
        while (true)
        {
            try
            {
                Log.Info("TcpClient, Trying Connect");
                tcpClient.Connect(IPAddress.Parse(address), port);
                if (SocketConnected(tcpClient.Client))
                {
                    Log.Info("TcpClient, Connected");
                    isConnected = true;
                    break;
                }
            }
            catch (Exception e)
            {
                Log.Info("TcpClient, connection failed. Try to reconnect after 30 seconds, {0}", e.Message);
            }
            finally
            {
                if (!isConnected)
                    Thread.Sleep(30000);
            }
        }
    }

    public void SendMessage(string msg)
    {
        if (!SocketConnected(tcpClient.Client))
        {
            TryConnect();
        }

        byte[] buffer = Encoding.UTF8.GetBytes(msg);
        tcpClient.Client.Send(buffer);
    }

    private bool SocketConnected(Socket s)
    {
        if (!s.Connected)
            return false;

        bool part1 = s.Poll(1000, SelectMode.SelectRead);
        bool part2 = s.Available == 0;
        return !(part1 && part2);
    }

    public void Dispose()
    {
        tcpClient.Close();
    }
}

作为Windows服务运行的服务器:

 public class TcpServer
{
    private bool started;
    private bool stopped;
    private TcpListener tcpListener;
    private static ManualResetEvent allDone = new ManualResetEvent(false);

    public TcpServer(string url, int port)
    {
        tcpListener = new TcpListener(IPAddress.Parse(url), port);
    }

    [MethodImpl(MethodImplOptions.Synchronized)]
    public void Run()
    {
        if (started) return;
        stopped = false;

        tcpListener.Start();

        Task.Run(() =>
        {
            Log.Info("Server running");
            while (!stopped)
            {
                allDone.Reset();
                tcpListener.BeginAcceptSocket(AcceptCallback, tcpListener);
                Log.Info("Accepting socket");
                allDone.WaitOne();
            }
        });

        Log.Info("Ping server started");
        started = true;
    }

    [MethodImpl(MethodImplOptions.Synchronized)]
    public void Stop()
    {
        if (!started) return;
        stopped = true;

        tcpListener.Stop();
        started = false;
        Log.Info("Ping server stopped");
    }

    private void AcceptCallback(IAsyncResult result)
    {
        try
        {
            allDone.Set();
            if (stopped) return;
            Log.Info("Socket accepted");

            var listener = (TcpListener)result.AsyncState;
            var socket = listener.EndAcceptSocket(result);

            Log.Info("Process socket");
            ProcessSocket(socket);
        }
        catch (Exception e)
        {
            Log.Info("Error accepting callback. {0}", e.Message);
        }
    }

    private void ProcessSocket(Socket socket)
    {
        try
        {
            byte[] buffer = new byte[256];
            while (!stopped && socket.Receive(buffer) != 0)
            {
                var msg = Encoding.UTF8.GetString(buffer);
                Console.WriteLine(msg);
            }
        }
        catch (Exception e)
        {
            socket.Close();
            Log.Info("Socket closed:{0}", !socket.Connected);
        }
    }
}

服务器的配置方式如下:对服务器的请求在一个IP xxx.xx.xxx.135:5050上处理,服务器的响应从xxx.xx.xxx.134:5050给出

客户端可以正常工作一段时间,但是在客户端出现以下错误之后:

  

连接尝试失败,因为被连接方未   一段时间后正确响应或建立连接   失败,因为连接的主机无法响应   xxx.xx.xxx.135:5050

客户端无法连接到服务器的原因是什么?

1 个答案:

答案 0 :(得分:1)

  

检查生产服务器上的防火墙设置

     

检查是否需要IP白名单

     

防病毒软件可能阻止了该请求

     

如果不走运,请在Chrome上手动安装Advanced REST Client工具   测试请求

     

https://forums.asp.net/t/2138734.aspx?A+connection+attempt+failed+because+the+connected+party+did+not+properly+respond+after+a+period+of+time