Пример #1
0
        private async Task WebSocketRequest(AspNetWebSocketContext context)
        {
            // Получаем сокет клиента из контекста запроса
            WebSocket socket = context.WebSocket;
            //Подключение к PostgreSQL
            PGLayer pg = new PGLayer();

            ArraySegment <byte> buffer = new ArraySegment <byte>(new byte[1024]);



            // Добавляем его в список клиентов, проверяем пользователя
            Locker.EnterWriteLock();
            try
            {
                WS ws = new WS();
                ws.client = socket;
                //Проверяем пользователя
                userStr = dispayName(ws);
                // Clients1.RemoveAll(us => us.user.ip == ws.user.ip && us.user.accountName == ws.user.accountName);
                Clients1.Add(ws);
                //Зафиксировали подключение пользователя
                string err = pg.user_conn(ws.user.accountName, "подключился/лась");
                // pg.connect();
                //if (err =="")
                await socket.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(userStr)), WebSocketMessageType.Text, true, CancellationToken.None);
            }
            finally
            {
                Locker.ExitWriteLock();
            }
            //проверка через LDAP
            //if (!validateUserByBind("jane", ""))
            //{ return; }

            // Слушаем сокет
            while (true)
            {
                // Ожидаем данные от него
                var result = await socket.ReceiveAsync(buffer, CancellationToken.None);

                //Количество клиентов сокета
                userCount userCount = new userCount();

                //Передаём сообщение всем клиентам
                for (int i = 0; i < Clients1.Count; i++)
                {
                    WebSocket client = Clients1[i].client;

                    try
                    {
                        // Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
                        if (client.State == WebSocketState.Open)
                        {
                            var text = Encoding.UTF8.GetString(buffer.Array.ToArray(), 0, result.Count);
                            //  if (text.Trim() != "")
                            JObject ob = JObject.Parse(text);
                            //пользователь подключился к серверу
                            if (ob["mode"].ToString() == "join")
                            {
                                string err = pg.user_conn(ob["user"]["accountName"].ToString(), "отключился/лась");
                            }
                            else
                            //сообщение пользователям
                            if (ob["mode"].ToString() == "msg")
                            {
                                string err = pg.user_msg(ob["user"]["accountName"].ToString(), ob["msg"].ToString(), 1, Clients1[i].user.ip);
                                await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(text)), WebSocketMessageType.Text, true, CancellationToken.None);
                            }
                            else
                            //поиск пользователя в AD
                            if (ob["mode"].ToString() == "FindUser")
                            {
                                var strFilter1 = new { mode = "strFilter", accountName = Clients1[i].user.accountName, str = FilterAD(ob["strFilter"].ToString()) };
                                //string err = pg.user_msg(ob["user"]["accountName"].ToString(), ob["msg"].ToString(), 1, Clients1[i].user.ip);
                                await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(strFilter1))), WebSocketMessageType.Text, true, CancellationToken.None);
                            }


                            //  await client.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(JsonConvert.DeserializeObject(text)))), WebSocketMessageType.Text, true, CancellationToken.None);
                            //var userCount = new { mode = "usersCount", usersCount = Clients1.Count };
                            userCount.usersCount = Clients1.Count; //Clients1.Count(us => us.client.State == WebSocketState.Open);
                            await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(userCount))), WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }

                    catch (ObjectDisposedException ex)
                    {
                        Locker.EnterWriteLock();
                        try
                        {
                            Clients1.RemoveAll(i1 => i1.client == client);
                            i--;
                        }
                        finally
                        {
                            Locker.ExitWriteLock();
                        }
                    }
                }
            }
        }