Ejemplo n.º 1
0
 /// <summary>
 /// 处理推送过来的消息
 /// </summary>
 /// <param name="rec"></param>
 private void Rec(WenSocket.Sockets sks)
 {
     this.Invoke(new ThreadStart(delegate
     {
         if (listBoxText.Items.Count > 1000)
         {
             listBoxText.Items.Clear();
         }
         if (sks.ex != null)
         {
             if (sks.ClientDispose == true)
             {
                 //由于未知原因引发异常.导致客户端下线.   比如网络故障.或服务器断开连接.
                 listBoxStates.Items.Add(string.Format("客户端下线.!"));
             }
             listBoxStates.Items.Add(string.Format("异常消息:{0}", sks.ex));
         }
         else if (sks.Offset == 0)
         {
             //客户端主动下线
             listBoxStates.Items.Add(string.Format("客户端下线.!"));
         }
         else
         {
             byte[] buffer = new byte[sks.Offset];
             Array.Copy(sks.RecBuffer, buffer, sks.Offset);
             string str = Encoding.UTF8.GetString(buffer);
             listBoxText.Items.Add(string.Format("服务端{0}发来消息:{1}", sks.Ip, str));
         }
     }));
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 向单独的一个客户端发送消息
 /// </summary>
 /// <param name="ip"></param>
 /// <param name="SendData"></param>
 public void SendToClient(IPEndPoint ip, string SendData)
 {
     try
     {
         Sockets sks = ClientList.Find(o => { return(o.Ip == ip); });
         if (sks == null || !sks.Client.Connected)
         {
             Sockets ks = new Sockets();
             //标识客户端下线
             sks.ClientDispose = true;
             sks.ex            = new Exception("客户端没有连接");
             pushSockets.Invoke(sks);
         }
         if (sks.Client.Connected)
         {
             //获取当前流进行写入.
             NetworkStream nStream = sks.nStream;
             if (nStream.CanWrite)
             {
                 byte[] buffer = Encoding.ASCII.GetBytes(SendData);
                 nStream.Write(buffer, 0, buffer.Length);
             }
             else
             {
                 //避免流被关闭,重新从对象中获取流
                 nStream = sks.Client.GetStream();
                 if (nStream.CanWrite)
                 {
                     byte[] buffer = Encoding.ASCII.GetBytes(SendData);
                     nStream.Write(buffer, 0, buffer.Length);
                 }
                 else
                 {
                     //如果还是无法写入,那么认为客户端中断连接.
                     ClientList.Remove(sks);
                     Sockets ks = new Sockets();
                     sks.ClientDispose = true;   //如果出现异常,标识客户端下线
                     sks.ex            = new Exception("客户端无连接");
                     pushSockets.Invoke(sks);    //推送至UI
                 }
             }
         }
     }
     catch (Exception skex)
     {
         Sockets sks = new Sockets();
         sks.ClientDispose = true;   //如果出现异常,标识客户端退出
         sks.ex            = skex;
         pushSockets.Invoke(sks);    //推送至UI
     }
 }
Ejemplo n.º 3
0
 /// <summary>
 /// 客户端加入队列
 /// </summary>
 /// <param name="sk"></param>
 private void AddClientList(Sockets sk)
 {
     lock (obj)
     {
         Sockets sockets = ClientList.Find(o => { return(o.Ip == sk.Ip); });
         if (sockets == null)
         {
             ClientList.Add(sk);
         }
         else
         {
             ClientList.Remove(sockets);
             ClientList.Add(sk);
         }
     }
 }
Ejemplo n.º 4
0
        public override void Stop()
        {
            Sockets sks = new Sockets();

            if (client != null)
            {
                client.Client.Shutdown(SocketShutdown.Both);
                Thread.Sleep(10);
                client.Close();
                IsClose = true;
                client  = null;
            }
            else
            {
                sks.ex = new Exception("客户端没有初始化.!");
            }
            pushSockets.Invoke(sks);    //推送至UI
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 获取处理新的链接请求
        /// </summary>
        private void GetAcceptTcpClient()
        {
            try
            {
                if (Listener.Pending())
                {
                    semap.WaitOne();
                    //接收到挂起的客户端请求链接
                    TcpClient tcpClient = Listener.AcceptTcpClient();

                    //维护处理客户端队列
                    Socket        socket = tcpClient.Client;
                    NetworkStream stream = new NetworkStream(socket, true);
                    Sockets       sks    = new Sockets(tcpClient.Client.RemoteEndPoint as IPEndPoint, tcpClient, stream);
                    sks.NewClientFlag = true;

                    //推送新的客户端连接信息
                    pushSockets.Invoke(sks);

                    //客户端异步接收数据
                    sks.nStream.BeginRead(sks.RecBuffer, 0, sks.RecBuffer.Length, new AsyncCallback(EndReader), sks);

                    //加入客户端队列
                    this.AddClientList(sks);

                    //链接成功后主动向客户端发送一条消息
                    if (stream.CanWrite)
                    {
                        //byte[] buffer = Encoding.ASCII.GetBytes(this.InitMsg);
                        //stream.Write(buffer, 0, buffer.Length);
                    }
                    semap.Release();
                }
            }
            catch
            {
                return;
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 处理接收到客户端的请求和数据
        /// </summary>
        /// <param name="sks"></param>
        private void Rev(WenSocket.Sockets sks)
        {
            this.Invoke(new ThreadStart(
                            delegate
            {
                if (treeViewClientList.Nodes[0] != null)
                {
                }

                if (sks.ex != null)
                {
                    if (sks.ClientDispose)
                    {
                        LogHelper.log.Info(string.Format("{0}客户端:{1}下线!", DateTime.Now.ToString(), sks.Ip));
                        listBoxServerInfo.Items.Insert(0, string.Format("{0}客户端:{1}下线!", DateTime.Now.ToString(), sks.Ip));
                        if (treeViewClientList.Nodes[0].Nodes.ContainsKey(sks.Ip.ToString()))
                        {
                            if (DicTreeIPEndPoint.Count != 0)
                            {
                                removTreeIPEndPoint(sks.Ip);
                                treeViewClientList.Nodes[0].Nodes.RemoveByKey(sks.Ip.ToString());

                                toolStripStatusLabelClientNum.Text = (int.Parse(toolStripStatusLabelClientNum.Text) - 1).ToString();    //treeViewClientList.Nodes[0].Nodes.Count.ToString();
                            }
                        }
                    }
                    listBoxServerInfo.Items.Insert(0, sks.ex.Message);
                }
                else
                {
                    if (sks.NewClientFlag)
                    {
                        LogHelper.log.Info(string.Format("{0}新的客户端:{1}链接成功", DateTime.Now.ToString(), sks.Ip));
                        listBoxServerInfo.Items.Insert(0, string.Format("{0}新的客户端:{1}链接成功", DateTime.Now.ToString(), sks.Ip));

                        TreeNode tn         = new TreeNode();
                        tn.Name             = sks.Ip.ToString();
                        tn.Text             = sks.Ip.ToString();
                        tn.ContextMenuStrip = contextMenuStripClientSingle;
                        tn.Tag        = "客户端";
                        tn.ImageIndex = 1;

                        treeViewClientList.Nodes[0].Nodes.Add(tn);

                        //treeview节点和IPEndPoint绑定
                        DicTreeIPEndPoint.Add(tn, sks.Ip);

                        if (treeViewClientList.Nodes[0].Nodes.Count > 0)
                        {
                            treeViewClientList.ExpandAll();
                        }
                        toolStripStatusLabelClientNum.Text = (int.Parse(toolStripStatusLabelClientNum.Text) + 1).ToString();
                    }
                    else if (sks.Offset == 0)
                    {
                        LogHelper.log.Info(string.Format("{0}客户端:{1}下线.!", DateTime.Now.ToString(), sks.Ip));
                        listBoxServerInfo.Items.Insert(0, string.Format("{0}客户端:{1}下线.!", DateTime.Now.ToString(), sks.Ip));
                        if (treeViewClientList.Nodes[0].Nodes.ContainsKey(sks.Ip.ToString()))
                        {
                            if (DicTreeIPEndPoint.Count != 0)
                            {
                                removTreeIPEndPoint(sks.Ip);
                                treeViewClientList.Nodes[0].Nodes.RemoveByKey(sks.Ip.ToString());
                                toolStripStatusLabelClientNum.Text = (int.Parse(toolStripStatusLabelClientNum.Text) - 1).ToString();
                            }
                        }
                    }
                    else
                    {
                        byte[] buffer = new byte[sks.Offset];
                        Array.Copy(sks.RecBuffer, buffer, sks.Offset);
                        string str = Encoding.ASCII.GetString(buffer);

                        LogHelper.log.Info(string.Format("{0}客户端 {1} 发来消息:{2}", DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"), sks.Ip, str));
                        listBox1.Items.Insert(0, string.Format("{0} 客户端 {1} 发来消息:{2}", DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"), sks.Ip, str));

                        //将接收到客户端的数据重新发送给客户端
                        //string SendStr = "TCPServers at [" + DateTime.Now.ToString("yyy-MM-dd HH:mm:ss") + "] Received your Data:" + str;
                        tcpServer.SendToClient(sks.Ip, str);
                        LogHelper.log.Info(string.Format("{0} 回复给 {1} 客户端消息:{2}", DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"), sks.Ip, str));
                        listBox1.Items.Insert(0, string.Format("{0} 回复给 {1} 客户端消息:{2}", DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"), sks.Ip, str));
                    }
                }
            }
                            )
                        );
        }