当前位置:编程学习 > C#/ASP.NET >>

【ASP.NET实现了服务器推技术后部署出现的问题】

不知道有没有人用asp.net实现过服务器推送技术
我使用这个技术实现了在线聊天
在本机浏览网站进行聊天没有任何问题
但是,当我把项目部署到服务器上的时候
其他机子访问网站进入聊天室
就无法进行正常的沟通了
请问,这是为什么呢?
有没有相关经验的高手来帮个忙呢
非常感谢~~~~~ --------------------编程问答-------------------- 没做过,关注 --------------------编程问答-------------------- comet客户端使用AJAX请求连接服务器
http://topic.csdn.net/u/20081125/17/a3ecaefe-86e6-4ead-80a2-537650b17405.html --------------------编程问答-------------------- 你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

就好象有人学socket通讯,于是很高兴自己学会了开发聊天软件。结果其实网上大部分通讯程序都是单击对单击,而且只有固定的一两个业务,如果你不模拟出真实环境则无法开发真实的大系统。而真实的环境是几千个或者上万个终端对一个服务,而且是超过100个业务,这完全是不同量级的比赛,前者过早玩了技术而丢了基本架构负载的权衡。软件设计时如果不考虑性能负载来选择技术手段,就算再觉得技术多么高级,也等于在悬崖上走钢丝。 --------------------编程问答-------------------- 不懂,关注 --------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

就好象有人学socket通讯,于是很高兴自己学会了开发聊天软件。结果其实网上大部分通讯程序都是单击对单击,而且只有固定的一两个业务,如果你不模拟出真实环境则无法开发真实的大系统。而真实的环境是几千个或者上万个终端对一个服务,而且是超过100个业务,这完全是不同量级的比赛,前者过早玩了技术而丢了基本架构负载的……

可以加QQ吗?在QQ上和你聊好吗?我的QQ是244945998

--------------------编程问答-------------------- 额

别的我都不说了,我只问你们有几百万的项目规划

嘿嘿,推?说着容易,别光看着google玩的不错,你的先想想google用的多少钱 --------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

就好象有人学socket通讯,于是很高兴自己学会了开发聊天软件。结果其实网上大部分通讯程序都是单击对单击,而且只有固定的一两个业务,如果你不模拟出真实环境则无法开发真实的大系统。而真实的环境是几千个或者上万个终端对一个服务,而且是超过100个业务,这完全是不同量级的比赛,前者过早玩了技术而丢了基本架构负载的……


我用的推技术就是客户端和服务器保持一条持久的连接
当有消息返回或者连接超时的时候返回,然后继续连接

我用ASP.NET开发,在连接这一块,使用了异步加自定义线程池来实现

我把连接的那块代码贴出来吧

 

       /// <summary>
        /// 等待回调
        /// </summary>
        private void QueueCometWaitRequest_WaitCallback()
        {
            //这个循环就是将连接保持
            while (true)
            {
                //Debug.WriteLine(string.Format("QueueCometWaitRequest_WaitCallback Tick: {0} {1} ", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId));

                CometWaitRequest[] processRequest;

                lock (this.state)
                {
                    processRequest = waitRequests.ToArray();
                }

                // 
                /*if (processRequest.Length == 0)
                    break;*/

                if (processRequest.Length == 0)
                {
                    //  
                    Thread.Sleep(100);
                }
                else
                {

                    for (int i = 0; i < processRequest.Length; i++)
                    {
                        try
                        {
                            CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);

                            if (processRequest[i].Active)
                            {
                                Thread.Sleep(1000);

                                //  如果超时,则返回,并将请求从等待队列中移除
                                if (DateTime.Now.Subtract(processRequest[i].DateTimeAdded).TotalSeconds >= cometClient.ConnectionTimeoutSeconds)
                                {
                                    //  移除请求
                                    DeactivateCometWaitRequest(processRequest[i]);

                                    //  发送超时消息
                                    CometMessage timeoutMessage = new CometMessage()
                                        {
                                            MessageId = 0,
                                            Name = "aspNetComet.timeout",
                                            Contents = null
                                        };

                                    processRequest[i].Result.CometMessages = new CometMessage[] { timeoutMessage };
                                    //  结束此次的请求
                                    this.QueueCometWaitRequest_Finished(processRequest[i]);
                                }
                                else
                                {
                                    //获取服务器上最新的消息
                                    CometMessage[] messages = this.CheckForServerPushMessages(processRequest[i]);

                                    if (messages != null && messages.Length > 0)
                                    {
                                        
                                        processRequest[i].Result.CometMessages = messages;
                                        // 将消息返回,释放一个等待的请求
                                        DeactivateCometWaitRequest(processRequest[i]);
                                        //  将相应放入另一个ASP.NET线程中
                                        this.QueueCometWaitRequest_Finished(processRequest[i]);
                                    }
                                }
                            }
                            else
                            {
                                //  请求未连接则检查空闲的请求
                                this.CheckForIdleCometWaitRequest(processRequest[i], cometClient);
                            }
                        }
                        catch (Exception ex)
                        {
                            if (processRequest[i].Active)
                            {
                                //  
                                DeactivateCometWaitRequest(processRequest[i]);

                                //
                                CometMessage errorMessage = new CometMessage()
                                {
                                    MessageId = 0,
                                    Name = "aspNetComet.error",
                                    Contents = ex.Message
                                };

                                //
                                processRequest[i].Result.CometMessages = new CometMessage[] { errorMessage };
                                //
                                this.QueueCometWaitRequest_Finished(processRequest[i]);
                            }
                            else
                            {
                                //  thread直接从队列中移除
                                this.DequeueCometWaitRequest(processRequest[i].ClientPrivateToken);
                            }
                        }
                    }
                }
            }
        }
--------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

就好象有人学socket通讯,于是很高兴自己学会了开发聊天软件。结果其实网上大部分通讯程序都是单击对单击,而且只有固定的一两个业务,如果你不模拟出真实环境则无法开发真实的大系统。而真实的环境是几千个或者上万个终端对一个服务,而且是超过100个业务,这完全是不同量级的比赛,前者过早玩了技术而丢了基本架构负载的……


我用的推技术就是客户端和服务器保持一条持久的连接
当有消息返回或者连接超时的时候返回,然后继续连接

我用ASP.NET开发,在连接这一块,使用了异步加自定义线程池来实现

我把连接的那块代码贴出来吧

 

       /// <summary>
        /// 等待回调
        /// </summary>
        private void QueueCometWaitRequest_WaitCallback()
        {
            //这个循环就是将连接保持
            while (true)
            {
                //Debug.WriteLine(string.Format("QueueCometWaitRequest_WaitCallback Tick: {0} {1} ", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId));

                CometWaitRequest[] processRequest;

                lock (this.state)
                {
                    processRequest = waitRequests.ToArray();
                }

                // 
                /*if (processRequest.Length == 0)
                    break;*/

                if (processRequest.Length == 0)
                {
                    //  
                    Thread.Sleep(100);
                }
                else
                {

                    for (int i = 0; i < processRequest.Length; i++)
                    {
                        try
                        {
                            CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);

                            if (processRequest[i].Active)
                            {
                                Thread.Sleep(1000);

                                //  如果超时,则返回,并将请求从等待队列中移除
                                if (DateTime.Now.Subtract(processRequest[i].DateTimeAdded).TotalSeconds >= cometClient.ConnectionTimeoutSeconds)
                                {
                                    //  移除请求
                                    DeactivateCometWaitRequest(processRequest[i]);

                                    //  发送超时消息
                                    CometMessage timeoutMessage = new CometMessage()
                                        {
                                            MessageId = 0,
                                            Name = "aspNetComet.timeout",
                                            Contents = null
                                        };

                                    processRequest[i].Result.CometMessages = new CometMessage[] { timeoutMessage };
                                    //  结束此次的请求
                                    this.QueueCometWaitRequest_Finished(processRequest[i]);
                                }
                                else
                                {
                                    //获取服务器上最新的消息
                                    CometMessage[] messages = this.CheckForServerPushMessages(processRequest[i]);

                                    if (messages != null && messages.Length > 0)
                                    {
                                        
                                        processRequest[i].Result.CometMessages = messages;
                                        // 将消息返回,释放一个等待的请求
                                        DeactivateCometWaitRequest(processRequest[i]);
                                        //  将相应放入另一个ASP.NET线程中
                                        this.QueueCometWaitRequest_Finished(processRequest[i]);
                                    }
                                }
                            }
                            else
                            {
                                //  请求未连接则检查空闲的请求
                                this.CheckForIdleCometWaitRequest(processRequest[i], cometClient);
                            }
                        }
                        catch (Exception ex)
                        {
                            if (processRequest[i].Active)
                            {
                                //  
                                DeactivateCometWaitRequest(processRequest[i]);

                                //
                                CometMessage errorMessage = new CometMessage()
                                {
                                    MessageId = 0,
                                    Name = "aspNetComet.error",
                                    Contents = ex.Message
                                };

                                //
                                processRequest[i].Result.CometMessages = new CometMessage[] { errorMessage };
                                //
                                this.QueueCometWaitRequest_Finished(processRequest[i]);
                            }
                            else
                            {
                                //  thread直接从队列中移除
                                this.DequeueCometWaitRequest(processRequest[i].ClientPrivateToken);
                            }
                        }
                    }
                }
            }
        }
--------------------编程问答-------------------- 就算在怎么消耗服务器的线程
但也不至于一个都连接不上吧..... --------------------编程问答-------------------- 果真如此啊,长连接

那么自己考虑一下,单服务器最多能支持多少个线程休眠?我想能支持100个就很了不起了,至少conn连接池大体也是这个数字,微软能设置这个数应该是有依据的,而且conn连接池也不是你这种完全占用,他还有默认的超时时间和释放机制,像这种“无保留”的长连接顶多能开50个 --------------------编程问答-------------------- 看不太懂你的代码的设计思路。例如我随便看到
                    for (int i = 0; i < processRequest.Length; i++)
                    {
                        try
                        {
                            CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);

                            if (processRequest[i].Active)
                            {
                                Thread.Sleep(1000);
这我就非常奇怪,既然for循环,而又sleep,你到底是要循环服务效率呢还是要阻塞?我在设计流程时,必须做到一个服务在处理业务或者甚至sleep的时候绝对不会影响其它的业务的并行处理,而你却自我阻塞了自己,所以我完全不理解你的基本的关于并发、异步的设计习惯,或许你从基础上就错了。 --------------------编程问答-------------------- 从你的这段代码,我建议你如果要设计并发、异步的系统,忘记过去的一切成绩而从头开始学习。 --------------------编程问答--------------------
引用 12 楼 sp1234 的回复:
从你的这段代码,我建议你如果要设计并发、异步的系统,忘记过去的一切成绩而从头开始学习。

sorry,那个是调试的时候加的,忘了删除
那我想问,这样要学习哪方面的知识呀,这个并发异步,我也不是太熟悉,要用就拿了点过来,一知半解的.... --------------------编程问答-------------------- Comet:基于 HTTP 长连接的“服务器推”技术
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/#resources
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,