コード例 #1
0
        private async void parseByCommand(chatMessage message, WebSocket webSocket, chatClientBuffer chatClientBuffer, IdbConnector connectionContext)
        {
            switch (message.command)
            {
            case (chatPacket.Commands.AUTH):
            {
                if (message.userSender.id == Guid.Empty)
                {
                    //получаем пользователей из БД
                    chatUser[] users = (chatUser[])await connectionContext.getData(message.userSender.login);

                    chatUser user;
                    //если это новый пользователь
                    if (users.Length == 0)
                    {
                        //даем ему guid
                        Guid id = Guid.NewGuid();
                        user    = new chatUser();
                        user.id = id;
                    }
                    else
                    {
                        //если пользователь не новый, то из запроса забираем его id
                        user = users[0];
                    }

                    //проверка на подключенного пользователя
                    chatClient client = chatClientBuffer.getClientByGuid(user.id);
                    //если пользователь уже был подключен
                    if (client != null)
                    {
                        if (client.socket.State == WebSocketState.Open)
                        {
                            //возвращаем пользователю его сообщение
                            await sendMessage(webSocket, message);

                            await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Пользователь уже в сети", CancellationToken.None);

                            return;
                        }
                        else
                        {
                            //если пользователь уже был в сети, но сокет не открыт, вырубаем его
                            message.userSender = user;
                            await chatClientBuffer.closeClient(message.userSender);
                        }
                    }
                    message.userSender = user;
                    //подключаем
                    await sendMessage(webSocket, message);

                    //отправим всех юзеров
                    chatMessage informationMessage = new chatMessage();
                    informationMessage.connectedUserList(message.userSender);
                    informationMessage.text = JsonConvert.SerializeObject(chatClientBuffer.getOnlineUsers());
                    await sendMessage(webSocket, informationMessage);

                    //добавление в клиенты
                    await chatClientBuffer.newClient(new chatClient(webSocket, message.userSender));
                }
                break;
            }

            case (chatPacket.Commands.SEND):
            {
                await chatClientBuffer.broadcast(message);

                break;
            }

            case (chatPacket.Commands.INFO):
            {
                //смена статуса
                //await chatClientBuffer.changeStatus(message.userSender, message.text);
                message.userSender.status = message.text;
                await chatClientBuffer.broadcast(message);

                connectionContext.Update(message.userSender);

                /*chatMessage informationMessage = new chatMessage();
                 * informationMessage.connectedUserList(message.userSender);
                 * informationMessage.text = JsonConvert.SerializeObject(chatClientBuffer.getOnlineUsers());
                 * await sendMessage(webSocket, informationMessage);*/
                break;
            }

            case (chatPacket.Commands.CLOSE):
            {
                await chatClientBuffer.closeClient(message.userSender);

                break;
            }

            default:
            {
                break;
            }
            }
        }
コード例 #2
0
        private async Task Handler(HttpContext context, WebSocket webSocket, chatClientBuffer chatClientBuffer, IdbConnector connectionContext)
        {
            var buffer = new byte[4 * 1024];
            ArraySegment <byte>    answer = new ArraySegment <byte>(buffer);
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(answer, CancellationToken.None);

            while (webSocket.State == WebSocketState.Open)
            {
                string answerstr = Encoding.UTF8.GetString(answer.Array, answer.Offset, result.Count);

                chatMessage mes = JsonConvert.DeserializeObject <chatMessage>(answerstr);
                parseByCommand(mes, webSocket, chatClientBuffer, connectionContext);

                result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
            }
        }