Обработка нескольких клиентов в сокете сервера C # - PullRequest
0 голосов
/ 08 июня 2019

Я хочу создать асинхронный сокет.Серверная сторона должна своевременно обрабатывать запросы клиентов, а не ставить их в очередь.Я прочитал больше и написал свой код, похожий на ссылку ниже.На стороне сервера все правильно, и у меня нет никаких ошибок или проблем, но на стороне клиента, когда я хочу получить данные, для первых полученных данных все хорошо, но при повторном вызове ReceiveCallback я получаю ошибку ниже:

 Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.

Ссылка:

 https://stackoverflow.com/questions/14974404/socket-programming-multiple-client-one-server

Мой код в методе ReceiveCallback:

private void ReceiveCallback(IAsyncResult asyncResult)
    {
        try
        {
            StateObject state = (StateObject)asyncResult.AsyncState;
            Socket client = state.workSocket;

            int bytesRead = 0;
            if (client != null)
                bytesRead = client.EndReceive(asyncResult);

            if (bytesRead > 0)
            {
                //string content = state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead)).ToString();
                Buffer.BlockCopy(state.buffer, 0, _imageBuff, _totBytesRead, bytesRead);
                _totBytesRead += bytesRead;
                //if (content.IndexOf(Cache.EndOfMessage, StringComparison.Ordinal) > -1)
                if (_totBytesRead < state.ImageSize)
                {
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, state);
                    //if (state.sb.Length > 1)
                    //{
                    //    _response = state.sb.ToString();
                    //}
                }
                else
                {
                    newMsgReceived(_imageBuff);
                    receiveDone.Set();
                }
            }

        }
        catch (Exception ex)
        {
            Log.CreateLog(Kit.Journal.Logger.Enums.LogType.Error, ex.Message, "ReceiveCallback in MonitoringSocket has error!");
        }
    }

Ошибка была для Blockcopy, часть моего метода ..

Я хочу протестировать свое приложение для обработки некоторого клиента на моем компьютере, прежде чем опубликовать его, я написал код ниже.Я использовал Threads.

 private void BtnConfirm_Click(object sender, RoutedEventArgs e)
    {
        //ImgDataGrid.Items.Clear();
        var pc = new PersianCalendar();
        var fromDate = pc.ToDateTime(_fromYear, _fromMonth, _fromDay, 0, 0, 0, 1);
        var toDate = pc.ToDateTime(_toYear, _toMonth, _toDay, 0, 0, 0, 1);

        byte[] fileNameObj = null;
        var thread = new Thread(() =>
        {
            fileNameObj = ServiceUtility.GetImageFileNames(fromDate, toDate);
            var fileNameListStrTemp = "";
            var fileNameListStr = new List<string>();
            if (fileNameObj != null && fileNameObj.Length > 0)
            {
                fileNameListStrTemp = Kit.Utility.ZipTask.Unzip(fileNameObj);
            }
            if (fileNameListStrTemp != null && !string.IsNullOrEmpty(fileNameListStrTemp))
            {
                fileNameListStr = fileNameListStrTemp.Split('|').ToList();

                FillDataGridView(fileNameListStr);
            }
            else
            {
                MessageBox.Show("");
            }
        });
        thread.Start();


        byte[] fileName = null;
        var thread1 = new Thread(() =>
        {
            fileName = ServiceUtility.GetImageFileNames(fromDate, toDate);
            var fileNameListStrTemp = "";
            var fileNameListStr = new List<string>();
            if (fileName != null && fileName.Length > 0)
            {
                fileNameListStrTemp = Kit.Utility.ZipTask.Unzip(fileName);
            }
            if (fileNameListStrTemp != null && !string.IsNullOrEmpty(fileNameListStrTemp))
            {
                fileNameListStr = fileNameListStrTemp.Split('|').ToList();

                FillDataGridView(fileNameListStr);
            }
            else
            {
                MessageBox.Show("");
            }
        });
        thread1.Start();
}

Сейчас я в замешательстве.Для обработки какого-либо запроса от клиента на стороне сервера, я должен поток на стороне сервера, или я могу написать как приведенный выше код?Мой код на стороне клиента неверен или проверить мой код в BtnConfirm_click неверно?

...