Beispiel #1
0
        private int currentCount   = 0; //timer
        #endregion

        #region functions
        private void WriteToStream(ChatMessageEntity messageEntity)
        {
            ObjectInversion inversion = new ObjectInversion();

            byte[] byteArr = inversion.SerializeTo((object)messageEntity);
            writer.Write(byteArr);
            writer.Flush();
        }
Beispiel #2
0
        private void heartbeatTimer_Tick(object sender, EventArgs e)
        {
            tickCountInStep++;
            if (tickCountInStep == tickCount)
            {
                if (ChatClientCollection.Count > 0)
                {
                    //计数器自动递增
                    expiryCountInStep++;
                    foreach (ChatClient ChatClient in ChatClientLists)
                    {
                        ChatClientOnLineCounter[ChatClient]++;
                    }
                    //连续监测三次之后,开始监测集合中的掉线情况
                    if (expiryCountInStep == expiryCount)
                    {
                        //寻找集合中“掉线”的用户
                        var disconnectedChatClients = ChatClientOnLineCounter.Where(p => p.Value >= 3).ToList();
                        foreach (var disconnectedChatClient in disconnectedChatClients)
                        {
                            txtLog.Append("用户" + disconnectedChatClient.Key.name + "掉线!");

                            //删除集合中被视为掉线的用户
                            ChatClientLists.Remove(disconnectedChatClient.Key);
                            ChatClientOnLineCounter.Remove(disconnectedChatClient.Key);

                            //开始广播发送掉线用户
                            ChatMessageEntity entity = new ChatMessageEntity();
                            entity.MessageType = ChatStateEnum.OffLine;
                            EndPoint curOfflineChatClientEP = disconnectedChatClient.Key.client.Client.RemoteEndPoint;
                            string   ChatClientName         = disconnectedChatClient.Key.name;
                            entity.MessageContentEx.Add(curOfflineChatClientEP, ChatClientName);

                            ObjectInversion inversion = new ObjectInversion();
                            byte[]          byteArr   = inversion.SerializeTo((object)entity);

                            try
                            {
                                foreach (ChatClient ChatClient in ChatClientLists)
                                {
                                    ChatClient.writer.Write(byteArr);
                                    ChatClient.writer.Flush();
                                }
                            }
                            catch { }
                        }
                        expiryCountInStep = 0;
                    }
                }
                tickCountInStep = 0;
            }
        }
Beispiel #3
0
        private void BroadCastChatClients()
        {
            ChatMessageEntity entity = new ChatMessageEntity();

            entity.MessageType      = ChatStateEnum.OnLine;
            entity.MessageContentEx = ChatClientCollection;

            ObjectInversion inversion = new ObjectInversion();

            byte[] byteArr = inversion.SerializeTo((object)entity);

            foreach (ChatClient ChatClient in ChatClientLists)
            {
                ChatClient.writer.Write(byteArr);
                ChatClient.writer.Flush();
            }
        }
Beispiel #4
0
        private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                client = new TcpClient(Dns.GetHostName(), ChatUtil.Port);
                txtMessage.Append("Successfully connected to Server side.");
            }
            catch (SocketException socketEx)
            {
                txtMessage.Append("Failed to connect server:" + socketEx.Data);
                return;
            }
            stream = client.GetStream();
            writer = new BinaryWriter(stream);
            ChatMessageEntity messageEntity = new ChatMessageEntity();

            messageEntity.NickName       = loginName;
            messageEntity.MessageType    = ChatStateEnum.OnLine;
            messageEntity.MessageContent = string.Empty;
            messageEntity.RemoteEndPoint = client.Client.LocalEndPoint;
            this.Text += " 【" + client.Client.LocalEndPoint + "】";
            messageEntity.timeStamp = DateTime.Now;

            WriteToStream(messageEntity);


            heartbeatTimer.Enabled = true;
            heartbeatTimer.Start();

            Task.Run(() =>
            {
                reader = new BinaryReader(stream);
                ObjectInversion inversion = new ObjectInversion();
                int bufferLen             = client.ReceiveBufferSize;
                byte[] recvBytes          = new byte[bufferLen];
                while (true)
                {
                    reader.Read(recvBytes, 0, bufferLen);
                    ChatMessageEntity entity = inversion.DeSerializeTo(recvBytes) as ChatMessageEntity;
                    AnalysisPackage(entity, null);
                }
            });
        }
Beispiel #5
0
        private void ReceiveClients(object ChatClient)
        {
            ChatClient      u         = ChatClient as ChatClient;
            ObjectInversion inversion = new ObjectInversion();

            byte[] recvBytes = new byte[u.client.ReceiveBufferSize];
            while (true)  //注意,这里需要加个循环,否则之后client发送的数据无法接收
            {
                try
                {
                    u.stream.Read(recvBytes, 0, recvBytes.Length); //sync mode, 为什么一切换到async mode,就会发生乱序
                    ChatMessageEntity entity = inversion.DeSerializeTo(recvBytes) as ChatMessageEntity;
                    AnalysisPackage(entity, u);

                    //清空数组,以免脏读
                    recvBytes = new byte[u.client.ReceiveBufferSize];
                }
                catch { }
            }
        }