06-20-2015, 11:53 PM
Доброго времени суток, господа. Есть ли у кого готовое решение на с# для получения и отправки информации, где одно приложение сервер-распространитель, а другое - клиент(-ы)? Искал, гуглил, читал на хабре, киберфоруме, и даже книжечку. Но видимо, ума не хватает.
В обработке запросов(ObrabotkaZaprosa):
Самое неприятное, что при очень быстром количестве запросов от клиента(раз в 100 мс) - сервер выпадает не удосужившись толком обьяснить в чём дело, ссылается на то, что было обращение к уже уничтоженным обьектам(самым разным). Может есть у кого готовое решение? Не могу до конца понять, как же всё-таки должен сервер общаться с клиентами. Код ужасен, помидорами кидайте, но помогите плс))
Код:
static void Main(string[] args)
{
Data.Connect = "Database=bdworld;Data Source=localhost;User Id=root;Password=root";
TcpListener server = null;
try
{
int MaxThreadsCount = Environment.ProcessorCount * 4;
Console.WriteLine(MaxThreadsCount.ToString());
// Максимальное количество рабочих потоков
ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
// Минимальное количество рабочих потоков
ThreadPool.SetMinThreads(2, 2);
// Порт для TcpListener = 9595.
Int32 port = 9595;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
int counter = 0;
server = new TcpListener(localAddr, port);
Data.parse_skills();
// Запускаем TcpListener и начинаем слушать клиентов.
server.Start();
// Принимаем клиентов в бесконечном цикле.
while (true)
{
Console.Write("\nWaiting for a connection... ");
// При появлении клиента добавляем в очередь потоков его обработку.
ThreadPool.QueueUserWorkItem(ObrabotkaZaprosa, server.AcceptTcpClient());
}
}
catch (SocketException e)
{
//В случае ошибки, выводим что это за ошибка.
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Останавливаем TcpListener.
server.Stop();
}
}
В обработке запросов(ObrabotkaZaprosa):
Код:
static void ObrabotkaZaprosa(object client_obj)
{
try
{
// Буфер для принимаемых данных.
Byte[] bytes = new Byte[256];
String data = null;
//Можно раскомментировать Thread.Sleep(1000);
//Запустить несколько клиентов
//и наглядно увидеть как они обрабатываются в очереди.
//Thread.Sleep(1000);
Data.client = client_obj as TcpClient;
data = null;
// Получаем информацию от клиента
Data.stream = Data.client.GetStream();
int i;
// Принимаем данные от клиента в цикле пока не дойдём до конца.
while ((i = Data.stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Преобразуем данные в ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
//В handling switch с определением что за сообщение, обработка его и возврат ответа в дату.
data = Data.handling(data);
// Преобразуем полученную строку в массив Байт.
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
try
{
// Отправляем данные обратно клиенту (ответ).
Data.stream.Write(msg, 0, msg.Length);
}
catch (Exception err)
{ Console.WriteLine(err.ToString()); }
}
// Закрываем соединение.
Data.client.Close();
}
catch { }
}
Самое неприятное, что при очень быстром количестве запросов от клиента(раз в 100 мс) - сервер выпадает не удосужившись толком обьяснить в чём дело, ссылается на то, что было обращение к уже уничтоженным обьектам(самым разным). Может есть у кого готовое решение? Не могу до конца понять, как же всё-таки должен сервер общаться с клиентами. Код ужасен, помидорами кидайте, но помогите плс))