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

Я пытаюсь отправить данные на свой сервер и получить их на другой стороне, но кажется, что я не могу передать данные Это мой код на стороне клиента:

 public void SendMessage(string MessageToSend)
        {
            MessageToSend += "#-*!!|#";
            byte[] buffer = Encoding.ASCII.GetBytes(MessageToSend);
        clientSocket.BeginSend(buffer, 0, buffer.Length, 0, new AsyncCallback(SendCallback), clientSocket);

    }

    private void SendCallback(IAsyncResult ar)
    {
        Socket client = (Socket)ar.AsyncState;
        int bytesSent = client.EndSend(ar);
        Console.WriteLine("Sent {0} bytes to server.", bytesSent);
    }

и вот мой сервер

 private void ReceiveCallBack(IAsyncResult ar)
        {
            StateObject state = (StateObject)ar.AsyncState;

            int received = state.workSocket.EndReceive(ar);

            if (received > 0)
            {
                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, received));
                content = state.sb.ToString();
                Console.WriteLine("RECEIVED  : " + Encoding.UTF8.GetString(state.buffer, 0, received));
                if (content.IndexOf("#-*!!|#") != -1)
                {                        StaticVariables.ReqHandler.Requests.Add(content.Substring(0, content.Length - 7));
                    state.workSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state);

                    state.sb.Clear();
                    return;
                }
                else
                {
                    state.workSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state);
                }
            }

        }

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

Обновление: когда я использую точку останова и проверяю переменную "content", я вижу много \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 и иду на пустую, когда выгляжу нормально, может ли это быть из-за моего размер буфера или что-то о кодировке?

Обновление 2: я только что понял, когда я иду с точками останова на этой строке

state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, received));

мой state.buffer полностью пуст. Я напишу начало моего кода и как я буду называть «ReceiveCallBack». Может быть, я что-то не так делаю в предыдущей части кода.

 public void StartServer()
        {
            serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
            serverSocket.Listen(10);
            serverSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
        }

        private void AcceptCallBack(IAsyncResult ar)
        {
            Socket socket = serverSocket.EndAccept(ar);
            clientSockets.Add(socket);
            StateObject State = new StateObject();
            State.workSocket = socket;
            socket.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallBack), State);
            serverSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
        }

Вот так я запускаю свой сервер. Я использую это для вызова StartServer

StaticVariables.SocketObject = new SocketConnection();
            Thread ServerThread = new Thread(() => StaticVariables.SocketObject.StartServer());
            ServerThread.Start();

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я только что понял, что не так. На этой строке:

socket.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallBack), State);

Я использовал переменную с именем «буфер», что нормально. Это означает, что данные попадут внутрь этой переменной. Но тогда на ReceiveCallBack я использовал это

state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, received));

Который я не заполнял state.buffer, поэтому я просто кодировал пустой байтовый массив, поэтому я не смог получить данные ... Не могу поверить, что не видел этого часами ...

Во всяком случае, я изменил свой прием, как это:

socket.BeginReceive(State.buffer, 0, State.buffer.Length, 0, new AsyncCallback(ReceiveCallBack), State);

так что теперь я могу заполнить данные объектом State и использовать их при обратном вызове ..

вкратце убедитесь, что вы заполняете входящие данные: |

0 голосов
/ 31 октября 2018

Клиент использует кодировку ASCII, на стороне сервера вы используете UTF8. Вы пробовали использовать одинаковые кодировки?

...