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

sunshine_am 2010-04-16 10:37:41
不知道有没有人用asp.net实现过服务器推送技术
我使用这个技术实现了在线聊天
在本机浏览网站进行聊天没有任何问题
但是,当我把项目部署到服务器上的时候
其他机子访问网站进入聊天室
就无法进行正常的沟通了
请问,这是为什么呢?
有没有相关经验的高手来帮个忙呢
非常感谢~~~~~
...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
coco_ke 2010-04-18
  • 打赏
  • 举报
回复
Comet:基于 HTTP 长连接的“服务器推”技术
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/#resources
sunshine_am 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sp1234 的回复:]
从你的这段代码,我建议你如果要设计并发、异步的系统,忘记过去的一切成绩而从头开始学习。
[/Quote]
sorry,那个是调试的时候加的,忘了删除
那我想问,这样要学习哪方面的知识呀,这个并发异步,我也不是太熟悉,要用就拿了点过来,一知半解的....
  • 打赏
  • 举报
回复
从你的这段代码,我建议你如果要设计并发、异步的系统,忘记过去的一切成绩而从头开始学习。
  • 打赏
  • 举报
回复
看不太懂你的代码的设计思路。例如我随便看到
                    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的时候绝对不会影响其它的业务的并行处理,而你却自我阻塞了自己,所以我完全不理解你的基本的关于并发、异步的设计习惯,或许你从基础上就错了。
wanghui0380 2010-04-17
  • 打赏
  • 举报
回复
果真如此啊,长连接

那么自己考虑一下,单服务器最多能支持多少个线程休眠?我想能支持100个就很了不起了,至少conn连接池大体也是这个数字,微软能设置这个数应该是有依据的,而且conn连接池也不是你这种完全占用,他还有默认的超时时间和释放机制,像这种“无保留”的长连接顶多能开50个
sunshine_am 2010-04-17
  • 打赏
  • 举报
回复
就算在怎么消耗服务器的线程
但也不至于一个都连接不上吧.....
sunshine_am 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

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

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

我用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);
}
}
}
}
}
}
sunshine_am 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

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

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

我用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);
}
}
}
}
}
}
wanghui0380 2010-04-17
  • 打赏
  • 举报
回复


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

嘿嘿,推?说着容易,别光看着google玩的不错,你的先想想google用的多少钱
sunshine_am 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

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

jking1989 2010-04-16
  • 打赏
  • 举报
回复
不懂,关注
  • 打赏
  • 举报
回复
你没有技术设计说明。初步判断,你所谓的服务器推就是那种1、2个就能拖死服务器得做法。

就好象有人学socket通讯,于是很高兴自己学会了开发聊天软件。结果其实网上大部分通讯程序都是单击对单击,而且只有固定的一两个业务,如果你不模拟出真实环境则无法开发真实的大系统。而真实的环境是几千个或者上万个终端对一个服务,而且是超过100个业务,这完全是不同量级的比赛,前者过早玩了技术而丢了基本架构负载的权衡。软件设计时如果不考虑性能负载来选择技术手段,就算再觉得技术多么高级,也等于在悬崖上走钢丝。
wuyq11 2010-04-16
  • 打赏
  • 举报
回复
unicode 2010-04-16
  • 打赏
  • 举报
回复
没做过,关注

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧