Remoting 做压力测试的时候,为什么报出信道 tcp 已注册的错误

nicochang 2006-07-30 10:41:56
一个remoting做的服务,用一个clinet连接上,没有问题
现在在客户端,用线程跑压力,客户端就出现信道 tcp 已注册的错误
这个错误究竟是说,客户端的tcp信道已注册,还是说服务器端的信道已注册呢
remoting 处理并发的时候,究竟是采用的什么机制,是多线程,还是队列
...全文
1091 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
amwih002 2010-06-07
  • 打赏
  • 举报
回复
..........
yishuqi 2010-06-01
  • 打赏
  • 举报
回复
是信道的名称不能重复,把信道名称修改一下.
  • 打赏
  • 举报
回复
当第二次执行test()时
————————————————————————————————
既然注释掉那句UnregisterChannel,那么第二次执行test必须是新的进程/应用程序域之内。
nicochang 2006-07-31
  • 打赏
  • 举报
回复
难道端口不是系统自动分配的吗
zhongwanli 2006-07-31
  • 打赏
  • 举报
回复
端口已注册
nicochang 2006-07-31
  • 打赏
  • 举报
回复
这样说,问题很清楚了,就是一个clinet为什么不能向一个server发出两次连接
问题应该是由于端口已经被占用造成的,但是,为什么不能自动分配端口呢
nicochang 2006-07-31
  • 打赏
  • 举报
回复
我把问题简化了一下,客户端连接remoting的代码是
private void test()
{

TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
Interface.IDALService service = (Interface.IDALService)Activator.GetObject(typeof(Interface.IDALService),"tcp://localhost:9000/GOA Data Access Layer Service");
//Database db = service.GetDatabase();
//string s = (string)db.ExecuteScalar(System.Data.CommandType.Text , "select messageid from t_message");
string s = service.Test();
//ChannelServices.UnregisterChannel(chan);

}
我把线程的并发去了,改成一个顺序的循环
private void button2_Click(object sender, System.EventArgs e)
{
for(int i = 0;i< 40;i++)
{
test();
}
}
跟踪这个程序,第一次执行test()没有问题
当第二次执行test()时
在Interface.IDALService service = (Interface.IDALService)Activator.GetObject(typeof(Interface.IDALService),"tcp://localhost:9000/GOA Data Access Layer Service");
中断
错误就是
未处理的“System.Runtime.Remoting.RemotingException”类型的异常出现在 mscorlib.dll 中。

其他信息: 信道 tcp 已注册。
如果把//ChannelServices.UnregisterChannel(chan);的注释去掉,就没有问题了

zhf777 2006-07-31
  • 打赏
  • 举报
回复
mark
zlkingdom 2006-07-31
  • 打赏
  • 举报
回复
动态端口可能不是很好测试吧,还是先用固定的端口测试吧
szc21 2006-07-31
  • 打赏
  • 举报
回复
mark,关注
  • 打赏
  • 举报
回复
先把 ChannelServices.UnregisterChannel(chan); 注释掉吧!

UnregisterChannel 是不可靠的。你应该考虑如何让所有线程在相关的重新分配端口号资源的语句互斥执行。
  • 打赏
  • 举报
回复
“调试,然后将错误信息、堆栈、代码、环境变量的分析测试”这些都是围绕着“断点”展开的。

程序异常时断点在哪里?
nicochang 2006-07-31
  • 打赏
  • 举报
回复
这是客户端代码
private void button1_Click(object sender, System.EventArgs e)
{
// test();
// SystemManager.frmSystemSetting setting = new frmSystemSetting();
// setting.Show();
Thread []threads = new Thread[40];
for(int i = 0 ; i < 40 ; i++)
{
Thread t= new Thread(new ThreadStart(test));
threads[i] = t;
}
for(int i = 0 ;i <40 ;i++)
{
threads[i].Start();
}

}
private void test()
{
TcpChannel chan = new TcpChannel(0);
ChannelServices.RegisterChannel(chan);
Interface.IDALService service = (Interface.IDALService)Activator.GetObject(typeof(Interface.IDALService),"tcp://localhost:9000/GOA Data Access Layer Service");
//Database db = service.GetDatabase();
//string s = (string)db.ExecuteScalar(System.Data.CommandType.Text , "select messageid from t_message");
string s = service.Test();
ChannelServices.UnregisterChannel(chan);

}
nicochang 2006-07-31
  • 打赏
  • 举报
回复
public class Server:MarshalByRefObject,IDALService
{

public Server()
{
}
//private static bool bRun;

// public static void Stop()
// {
// //bRun = false;
// }
// #region IDALService 成员
//
public string Test()
{
return "test";
}
//
// #endregion


}
}
nicochang 2006-07-31
  • 打赏
  • 举报
回复
这是服务器端的代码
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
//Thread t = new Thread(new ThreadStart(Server.Startup));
Thread t = new Thread(new ThreadStart(Startup));
t.Start();
}

/// <summary>
/// 停止此服务。
/// </summary>
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
//Server.Stop();
bRun = false;
}
private static bool bRun;

public static void Startup()
{
TcpChannel channel = new TcpChannel(9000);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server),"GOA Data Access Layer Service",WellKnownObjectMode.SingleCall);
bRun = true;
while(bRun)
{
Thread.Sleep(1000);
}
}
  • 打赏
  • 举报
回复
难道你不是使用vs么?如果是,请调试,然后将错误信息、堆栈、代码、环境变量的分析测试等具体内容贴出来。这样问问题太浪费时间。
nicochang 2006-07-30
  • 打赏
  • 举报
回复
我的clinet就是没有固定端口
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
Interface.IDALService service = (Interface.IDALService)Activator.GetObject(typeof(Interface.IDALService),"tcp://localhost:9000/GOA Data Access Layer Service");
string s = service.Test();
nicochang 2006-07-30
  • 打赏
  • 举报
回复
指定端口0 ,我试过了,也是一样的问题
nicochang 2006-07-30
  • 打赏
  • 举报
回复
没明白,能详细的解释一下吗
  • 打赏
  • 举报
回复
一般客户机不应该固定端口号,如果你是多线程模拟客户端,应该使用端口号0(由系统自动分配)。如果你的程序不支持客户端自动分配端口号,那么使用多台机器(包括虚机)去模拟吧。估计单个物理机无法用于你的测试。
加载更多回复(5)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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