【ASP.NET实现了服务器推技术后部署出现的问题】
不知道有没有人用asp.net实现过服务器推送技术我使用这个技术实现了在线聊天
在本机浏览网站进行聊天没有任何问题
但是,当我把项目部署到服务器上的时候
其他机子访问网站进入聊天室
就无法进行正常的沟通了
请问,这是为什么呢?
有没有相关经验的高手来帮个忙呢
非常感谢~~~~~ --------------------编程问答-------------------- 没做过,关注 --------------------编程问答-------------------- comet客户端使用AJAX请求连接服务器
http://topic.csdn.net/u/20081125/17/a3ecaefe-86e6-4ead-80a2-537650b17405.html --------------------编程问答-------------------- 你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。
就好象有人学socket通讯,于是很高兴自己学会了开发聊天软件。结果其实网上大部分通讯程序都是单击对单击,而且只有固定的一两个业务,如果你不模拟出真实环境则无法开发真实的大系统。而真实的环境是几千个或者上万个终端对一个服务,而且是超过100个业务,这完全是不同量级的比赛,前者过早玩了技术而丢了基本架构负载的权衡。软件设计时如果不考虑性能负载来选择技术手段,就算再觉得技术多么高级,也等于在悬崖上走钢丝。 --------------------编程问答-------------------- 不懂,关注 --------------------编程问答--------------------
可以加QQ吗?在QQ上和你聊好吗?我的QQ是244945998
--------------------编程问答-------------------- 额
别的我都不说了,我只问你们有几百万的项目规划
嘿嘿,推?说着容易,别光看着google玩的不错,你的先想想google用的多少钱 --------------------编程问答--------------------
我用的推技术就是客户端和服务器保持一条持久的连接
当有消息返回或者连接超时的时候返回,然后继续连接
我用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);
}
}
}
}
}
}
我用的推技术就是客户端和服务器保持一条持久的连接
当有消息返回或者连接超时的时候返回,然后继续连接
我用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++)这我就非常奇怪,既然for循环,而又sleep,你到底是要循环服务效率呢还是要阻塞?我在设计流程时,必须做到一个服务在处理业务或者甚至sleep的时候绝对不会影响其它的业务的并行处理,而你却自我阻塞了自己,所以我完全不理解你的基本的关于并发、异步的设计习惯,或许你从基础上就错了。 --------------------编程问答-------------------- 从你的这段代码,我建议你如果要设计并发、异步的系统,忘记过去的一切成绩而从头开始学习。 --------------------编程问答--------------------
{
try
{
CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);
if (processRequest[i].Active)
{
Thread.Sleep(1000);
sorry,那个是调试的时候加的,忘了删除
那我想问,这样要学习哪方面的知识呀,这个并发异步,我也不是太熟悉,要用就拿了点过来,一知半解的.... --------------------编程问答-------------------- Comet:基于 HTTP 长连接的“服务器推”技术
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/#resources
补充:.NET技术 , ASP.NET