Как я продолжаю принимать данные на моем асинхронном сокете? - PullRequest
0 голосов
/ 18 ноября 2018

Итак, я настроил очень простой сервер и клиент, используя класс Socket в C #.Я сделал один ранее, где он не был асинхронным, поэтому я решил попробовать.

Проблема, с которой я столкнулся, заключается в том, что я продолжаю отправлять данные с сервера на клиент, но клиент получает только первый, а затемэто как будто перестает слушать.Какие есть способы, чтобы продолжать проверять, есть ли входящие данные, а затем, если есть, просто захватить их?

Клиент

private static Socket _clientSocket;
        private static byte[] buffer = new byte[2048];

        static void Main(string[] args)
        {
            Connect();
            Console.ReadLine();
        }

        private static void Connect()
        {
            try
            {
                _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Loopback, 1234), new AsyncCallback(ConnectCallback), null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ConnectCallback(IAsyncResult AR)
        {
            try
            {
                _clientSocket.EndConnect(AR);
                Console.WriteLine("Connected to the server");


                _clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), _clientSocket);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket clientSocket = AR.AsyncState as Socket;
            var length = clientSocket.EndReceive(AR);

            byte[] packet = new byte[length];
            Array.Copy(buffer, packet, packet.Length);


            var data = Encoding.ASCII.GetString(packet);
            Console.WriteLine("Received " + data);
        }

И сервер

private static Socket _clientSocket;
        private static byte[] buffer = new byte[2048];

        static void Main(string[] args)
        {
            Connect();
            Console.ReadLine();
        }

        private static void Connect()
        {
            try
            {
                _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Loopback, 1234), new AsyncCallback(ConnectCallback), null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ConnectCallback(IAsyncResult AR)
        {
            try
            {
                _clientSocket.EndConnect(AR);
                Console.WriteLine("Connected to the server");


                _clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), _clientSocket);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket clientSocket = AR.AsyncState as Socket;
            var length = clientSocket.EndReceive(AR);

            byte[] packet = new byte[length];
            Array.Copy(buffer, packet, packet.Length);


            var data = Encoding.ASCII.GetString(packet);
            Console.WriteLine("Received " + data);
        }

1 Ответ

0 голосов
/ 18 ноября 2018

В вашем ReceiveCallback снова вызовите BeginReceive для продолжения получения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...