Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一段时间后无法连接到服务器_C#_.net_Asyncsocket - Fatal编程技术网

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

C# 一段时间后无法连接到服务器,c#,.net,asyncsocket,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();

客户:

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

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

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

检查是否需要IP白名单

防病毒软件可能正在阻止请求

如果运气不好,请在Chrome上安装高级REST客户端工具并手动安装 测试请求


没有人会读取异常消息:(客户端无法连接到服务器的原因是“连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应xxx.xx.xxx.135:5050”