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(); }
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; } }
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(); } }
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); } }); }
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 { } } }