专注于分布式,性能优化,代码之美

C# Socket 客户端与服务端通讯(二:服务端代码说明详细介绍)

接上一篇文章,有了客户端发送请求,那么接下来就是服务端监听请求废话不多说,代码如下:

服务端监听代码实例:
 
 //定义侦听端口
                IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, Port);
                //定义套接字类型,创建服务端 SocketServer
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //设置SOCKET允许多个SOCKET访问同一个本地IP地址和端口号
                //  socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                //连接
                socket.Bind(ipEnd);
                //开始侦听
                socket.Listen(10);
                //一旦接受连接,创建一个客户端
                WaitCallback waitCallback = new WaitCallback(DealData);
                while (true)
                {
                    //服务端,监听客户端的连接
                    Socket client = socket.Accept();
                    //将方法排入队列以便执行,WaitCallback,表示要执行的方法。如果将方法成功排入队列,则为 true;否则为 false
                    ThreadPool.QueueUserWorkItem(waitCallback, client);
                }
 
    /// <summary>
        /// 处理接收到的数据
        /// </summary>
        /// <param name="data"></param>
        private void DealData(object state)
        {
            byte[] data = new byte[1024];
            try
            {
                Socket client = (Socket)state;
                if (client.Receive(data) > 0)
                {
                    int port = (client.RemoteEndPoint as IPEndPoint).Port;
                    System.Net.IPAddress ipAdd = (client.RemoteEndPoint as IPEndPoint).Address;
                  
                    data = JXDecrypt(data);
                    string afterDecode = System.Text.Encoding.UTF8.GetString(data);
                    
                    if (!string.IsNullOrEmpty(afterDecode))
                    {
                        // 这里可以写处理逻辑
                        string[] splitRP = afterDecode.Split('\t');
                        if (splitRP != null && splitRP.Length > 4)
                        {
                            string cmd = splitRP[0];//推送类型
                            string randomNumber = splitRP[1].ToString();// 随机码转换的字符串
                            string lotteryCode = splitRP[2].ToString();// 玩法英文名称
                            string stage = splitRP[3].Split('\0')[0].ToString();// 期号
                            string funRsp = string.Empty;
                            RespMsg(client, randomNumber);
                       
                      
                       
                            DateTime time2 = DateTime.Now;
                            TimeSpan ts = time1.Subtract(time2).Duration();
                            string dateDiff = ts.Minutes.ToString() + "分钟" + ts.Seconds.ToString() + "秒" + ts.Milliseconds.ToString() + "ss";
                            LogHelp.ServiceSocketStep.Info("处理完一笔数据索要的时间为:{" + dateDiff + "}");
                        }
                        else
                        {
                            LogHelp.ServiceSocket.Info("【Socket Server】 " + "获取数据长度有错误!");
                        }
                    }
                    else
                    {
                        LogHelp.ServiceSocketStep.Info("【Socket Server】 " + "没有获取到解密后的文件!");
                    }
                    LogHelp.ServiceSocketStep.Info("【Socket Server】 " + "------------------------------------------------------结束一次监听-----------------------------------------------------");
                }
            }
            catch (Exception ex)
            {
                LogHelp.ServiceSocketStep.Error("处理新推送出错:" + ex.Message, ex);
            }
        }
 

posted on 2015-12-10 21:46  xiaohouye  阅读(246)  评论(0编辑  收藏  举报

导航

今日之劳累是为了铸造明日之辉煌,不管年龄多少,都无法阻挡我对软件艺术的追求!