Ejemplo n.º 1
0
 /// <summary>
 /// 发送数据到所有连入的客户端
 /// </summary>
 /// <param name="data"></param>
 private void SendToClientByName(ClientWrapper client, byte[] data, string UserName)
 {
     try
     {
         if (client == null)
         {
             WriteLog("SendToClientByName", "ClientWrapper的client为空!");
         }
     }
     catch (Exception ex)
     {
         WriteLog("SendToClientByName", ex);
     }
     if (client.Socket.Connected)
     {
         try
         {
             // 如果某客户端 Socket 是连接状态,则向其发送数据
             client.Socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendToClientComplete), client);
         }
         catch (SocketException ex)
         {
             HandleException(client, ex);
         }
     }
     else
     {
         // 某 Socket 断开了连接的话则将其关闭,并将其清除出客户端 Socket 列表
         // 也就是说每次向所有客户端发送消息的时候,都会从客户端 Socket 集合中清除掉已经关闭了连接的 Socket
         try
         {
             client.Socket.Close();
             lvClient.Items.Remove(dicCilents[UserName]);
             dicCilents.Remove(UserName);
             lstClients.Remove(client);
             lsrv.LoginOut(UserName);
             WriteLog(string.Format("客户端{0}关闭了连接正常退出!", client.UserName));
         }
         catch (Exception e)
         {
             WriteLog("SendToClientByName=== client.Socket.Close&lsrv.LoginOut", e);
         }
     }
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 发送数据到所有连入的客户端
 /// </summary>
 /// <param name="data">需要发送的数据</param>
 private void SendToClientByName(ClientWrapper client, string data, string UserName)
 {
     try
     {
         WriteLog(UserName);
         byte[] byteData = UTF8Encoding.UTF8.GetBytes(data);
         SendToClientByName(client, byteData, UserName);
     }
     catch (Exception ex)
     {
         clearClients(client);
         WriteLog("SendToClientByName", ex);
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 客户端连接完成的回调函数
        /// </summary>
        /// <param name="async"></param>
        private void ClientConnectComplete(IAsyncResult async)
        {
            ClientWrapper client = new ClientWrapper();
            try
            {
                // 完成接受客户端传入的连接的这个异步操作,并返回客户端连入的 socket
                client.Socket = sktServer.EndAccept(async);

                // 将客户端连入的 Socket 放进客户端 Socket 列表
                lstClients.Add(client);
            }
            catch (Exception ex)
            {
                WriteLog("ClientConnectComplete===client.Socket", ex);
            }
            try
            {
                // 开始接收客户端传入的数据
                client.Socket.BeginReceive(client.Buffer, 0, client.Buffer.Length, SocketFlags.None, new AsyncCallback(ClientReceiveComplete), client);
            }
            catch (SocketException ex)
            {
                HandleException(client, ex);
            }
            try
            {
                sktServer.BeginAccept(new AsyncCallback(ClientConnectComplete), null);//继续接受下一个连接(关键!否则只能监听到第一个连接)
            }
            catch (SocketException ex)
            {
                HandleException(client, ex);
            }
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 处理 SocketException 异常
 /// </summary>
 /// <param name="client">导致异常的 ClientSocketPacket</param>
 /// <param name="ex">SocketException</param>
 private void HandleException(ClientWrapper client, SocketException ex)
 {
     try
     {
         // 在服务端记录异常信息,关闭导致异常的 Socket,并将其清除出客户端 Socket 列表
         //OutPut("异常:" + client.Socket.RemoteEndPoint.ToString() + " - " + ex.Message);
         client.Socket.Close();
         lsrv.LoginOut(client.UserName);
         WriteLog(string.Format("客户端{0}异常退出!", client.UserName));
         clearClients(client);
     }
     catch (Exception e)
     {
         WriteLog("HandleException", e);
     }
 }
Ejemplo n.º 5
0
 private void clearClients(ClientWrapper client)
 {
     if (lvClient.Items.Contains(dicCilents[client.UserName]))
     {
         lvClient.Items.Remove(dicCilents[client.UserName]);
     }
     if (dicCilents.ContainsKey(client.UserName))
     {
         dicCilents.Remove(client.UserName);
     }
     if (lstClients.Contains(client))
     {
         lstClients.Remove(client);
     }
 }