Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2013, 16:09   #1
Максим911
Новичок
Джуниор
 
Регистрация: 20.08.2013
Сообщений: 1
По умолчанию Многопоточное приложение клиент-сервер C#

Здравствуйте.Задача:
Разработать приложения для синхронизации работы внешних клиентов с хранилищем данных (хранилище – хэш-таблица). Условия:
1. Несколько клиентов могут одновременно читать из хранилища.
2. Запись в хранилище может одновременно производить только один клиент.
3. Необходимо реализовать механизм транзакций для возможности “отката” изменений в случае ошибки при операции записи.
Написал код. Чтение происходит и запись.не понятно могут ли несколько клиентов читать.
не знаю как блокировать операцию записи для других клиентов и организовать механизм транзакций.Помогите плиз=)
Сервер:class1.cs
Код:
namespace ConsoleApplication6
{
    class Class1
    {  
        private Boolean _isRunning;
        private const int listenPort = 11000;
       static  UdpClient _server = new UdpClient(listenPort);
       int recv;
       int recv1;
       int recv2;
       byte[] data ;
       byte[] data1;
       byte[] data2;
       byte[] data3;
       static IPEndPoint ipep;
      static Socket SrvSock ;
      static IPEndPoint sender ;
      static EndPoint Remote;
      Hashtable ht = new Hashtable();
        
        public Class1(int port){
           
            ht["First"] = "Mikle";
            ht["Second"] = "Genry";
            ht["Third"] = "John";
            data = new byte[1024];
            data1 = new byte[1024];
            data2 = new byte[1024];
            ipep = new IPEndPoint(IPAddress.Any, 9050);
            SrvSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            SrvSock.Bind(ipep);
 
            Console.WriteLine("Ожидаем соединения с клиентами...");
            sender = new IPEndPoint(IPAddress.Any, 0);
            Remote = (EndPoint)(sender);
   
            
            _isRunning = true;
 
            LoopClients();
        }
 
        public void LoopClients()
        {
 
           
 
                UdpClient newc = new UdpClient();
        
                Thread t = new Thread(new ParameterizedThreadStart(HandleClient));
                t.Start(newc);
            
            
        }
 
        public void HandleClient(object obj)
        {
  
            Boolean bClientConnected = true;
 
            while (bClientConnected)
            {
                try
                {
                    data = new byte[1024];
                    data2 = new byte[1024];
                  
                    data1 = new byte[1024];
                 
                    recv = SrvSock.ReceiveFrom(data, ref Remote);
                    
                    string str = Encoding.UTF8.GetString(data, 0, recv);
 
                   
                    if (str == "exit") break;
                    if (str == "1")
                    {
 
                       
                        recv1 = SrvSock.ReceiveFrom(data1, ref Remote);
                       
                        string str1 = Encoding.UTF8.GetString(data1, 0, recv1);
                        Console.WriteLine("\r\nПолучили данные: " + str1);
                        string my = ht[str1].ToString();
                        Console.WriteLine(my);
 
               data2 = Encoding.UTF8.GetBytes(my);
                       
                        SrvSock.SendTo(data2, data2.Length, SocketFlags.None, Remote);
                    }
                        
                   
                    else
                        if (str == "2")
                        {
                            data2 = new byte[1024];
                          
                            data1 = new byte[1024];
                            recv1 = SrvSock.ReceiveFrom(data1, ref Remote);
                          
                            string str1 = Encoding.UTF8.GetString(data1, 0, recv1);
                            Console.WriteLine("\r\nПолучили данные: " + str1);
                            recv2 = SrvSock.ReceiveFrom(data2, ref Remote);
                        
                            string str2 = Encoding.UTF8.GetString(data2, 0, recv1);
                            Console.WriteLine("\r\nПолучили данные: " + str2);
                            string my = "Запись прошла успешно!";
                        
                            ht.Add(str1, str2);
                            data3 = Encoding.UTF8.GetBytes(my);
                         
                            SrvSock.SendTo(data3, data3.Length, SocketFlags.None, Remote);
                            foreach (DictionaryEntry de in ht)
                            {
                                Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
                            }
                        }
 
             
 
                }
                  catch (Exception ex)
                { Console.WriteLine(ex.ToString()); }
            }
          
        }
        
}
    }
Максим911 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
клиент-сервер приложение Karney Visual C++ 5 19.10.2012 21:14
Приложение клиент\сервер с БД Vol666 БД в Delphi 1 08.10.2009 12:28
Приложение клиент\сервер Vol666 Работа с сетью в Delphi 5 08.10.2009 09:06
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Многопоточное соединение сервер-клиент ShadowMaster Работа с сетью в Delphi 5 15.08.2008 16:36