Непрерывная передача данных через сокеты - PullRequest
0 голосов
/ 22 октября 2018

Я создал базовое приложение на C #, которое получает и отправляет данные через сокеты.В настоящее время я могу отправлять данные с моего клиента на сервер и получать ответ.Моя проблема: как клиент, я не знаю, как проверить, отправил ли сервер мне что-нибудь новое.Обычно я отправляю что-то в качестве клиента и получаю ответ, проблем нет, но иногда сервер должен отправить мне некоторую информацию.Это мой текущий пример кода, я обновлю этот пост, если я изменю код

Мой код на стороне сервера выглядит так:

 public class StateObject
        {
            // Client  socket.  
            public Socket workSocket = null;
            // Size of receive buffer.  
            public const int BufferSize = 1024;
            // Receive buffer.  
            public byte[] buffer = new byte[BufferSize];
            // Received data string.  
            public StringBuilder sb = new StringBuilder();


        }

        public static ManualResetEvent allDone = new ManualResetEvent(false);

        public void StartListening()
        {
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 10101);

            Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(10);

                while (true)
                {
                    allDone.Reset();
                    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                    allDone.WaitOne();
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }


        public void AcceptCallback(IAsyncResult ar)
        {
            allDone.Set();

            Socket listener = (Socket)ar.AsyncState;
            Socket handler = listener.EndAccept(ar);
            StateObject state = new StateObject();
            state.workSocket = handler;
            ClientList.Add(handler);

            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);

        }

        public void ReadCallback(IAsyncResult ar)
        {
            string content = string.Empty;
            StateObject state = (StateObject)ar.AsyncState;
            Socket handler = state.workSocket;

            int bytesRead = handler.EndReceive(ar);

            if (bytesRead > 0)
            {
                state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
                content = state.sb.ToString();
                if (content.IndexOf("_|_!#*#_") > -1)
                {
                    HandleIncomingMessage(handler, content.Substring(0, content.Length - 8));
                }
                else
                {
                    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
                }
            }
        }

        private void HandleIncomingMessage(Socket handler, string data)
        {
            CheckForIllegalCrossThreadCalls = false;
            Response response = new Response();


            byte[] byteData = Encoding.UTF8.GetBytes(data);

            listView1.Items.Add(data);
            response = ParserToSocket(data);

            if (response == null)
            {
                response = new Response();
                response.Status = "false";
                response.Message = "Json not valid" + data;
            }
            if (response.Status == null)
                response.Status = "false";
            if (response.Message == null)
                response.Message = "Error while creating response message";

            byte[] ByteArrayToSend = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(response) + "_|_!#*#_");


            handler.BeginSend(ByteArrayToSend, 0, ByteArrayToSend.Length, 0, new AsyncCallback(SendCallback), handler);

        }

        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);

                Socket handler = (Socket)ar.AsyncState;
                int bytesSent = handler.EndSend(ar);
                StateObject state = (StateObject)ar.AsyncState;
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);


            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

, и это код для моей клиентской стороны:

 public class StateObject
        {
            public Socket workSocket = null;
            public const int BufferSize = 512;
            public byte[] buffer = new byte[BufferSize];
            public StringBuilder sb = new StringBuilder();
        }

    private string response = string.Empty;
    public Socket ConnectedSocket;

    IPHostEntry ipHostInfo;
    IPAddress ipAddress;
    IPEndPoint remoteEP;

    private string StartClient()
    {
        try
        {
            ipHostInfo = Dns.GetHostEntry("127.0.0.1");
            ipAddress = ipHostInfo.AddressList[0];
            remoteEP = new IPEndPoint(ipAddress, 10101);
            ConnectedSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            ConnectedSocket.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), ConnectedSocket);
            return "";
        }
        catch (Exception e)
        {
            Console.WriteLine("CLIENT ERROR : \n" + e.ToString());
            return "";
        }
    }
    private void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            Socket client = (Socket)ar.AsyncState;
            client.EndConnect(ar);
            Console.WriteLine("Client connected to server.");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }


    public string SendMessageToServer(string text)
    {
        StartClient();
        response = string.Empty;
        text += "_|_!#*#_";
        byte[] byteData = Encoding.UTF8.GetBytes(text);

        ConnectedSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), ConnectedSocket);
        while(response.IndexOf("_|_!#*#_") == -1)
        {

        }
        response = response.Replace("_|_!#*#_", "");
        return response;
    }

    private void SendCallback(IAsyncResult ar)
    {
        try
        {
            Socket client = (Socket)ar.AsyncState;
            int bytesSent = client.EndSend(ar);

            StateObject state = new StateObject();
            state.workSocket = client;
            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.workSocket;
            int bytesRead = client.EndReceive(ar);

            if (bytesRead > 0)
            {
                state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead));

                response = state.sb.ToString();

                if (response.IndexOf("_|_!#*#_") != -1)
                {
                    state.sb.Clear();
                    return;
                }
                else
                {
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                }

            }
            else
            {
                if (state.sb.Length > 1)
                {
                    response = state.sb.ToString();
                }
                client.EndReceive(ar);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
...