Я хочу создать асинхронный сокет.Серверная сторона должна своевременно обрабатывать запросы клиентов, а не ставить их в очередь.Я прочитал больше и написал свой код, похожий на ссылку ниже.На стороне сервера все правильно, и у меня нет никаких ошибок или проблем, но на стороне клиента, когда я хочу получить данные, для первых полученных данных все хорошо, но при повторном вызове 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 неверно?