【问题标题】:can not connect to server after some time一段时间后无法连接到服务器
【发布时间】:2019-05-13 03:51:50
【问题描述】:

客户:

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

客户端连接不上服务器是什么原因?

【问题讨论】:

  • Nobody never read exception messages :( 客户端无法连接服务器的原因是“连接尝试失败,因为连接方一段时间后没有正确响应,或建立连接失败,因为连接的主机未能响应 xxx.xx.xxx.135:5050"

标签: c# .net asyncsocket


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2017-04-24
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多