Remoting客服端断网问题

wsw0515 2008-09-22 03:06:49
一个Remoting服务器下有多个客服端,如果某个客服端的网络突然断了,服务器端将在一段时间内发送不出数据。
高手救命啊!
...全文
473 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbigwife 2010-08-20
  • 打赏
  • 举报
回复
呵呵,虽然落后了,不过学到比落后更重要。
DalyQiao 2008-10-18
  • 打赏
  • 举报
回复
props["timeout"] = 30000;
谢谢楼上,我要的就是这个,呵呵,楼主的问题估计可以解决了
wsw0515 2008-10-18
  • 打赏
  • 举报
回复
谢谢各位关注,帖子已到期,先结贴,以后找到了好的办法,再公布
wsw0515 2008-10-18
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 wuqiubin 的回复:]
解决了没有啊
没有的话,我可以帮助你
首先在服务器客户端设定timeout属性,如下:
IDictionary props = new Hashtable();
props["timeout"] = 30000;
props["name"] = System.Guid.NewGuid().ToString();
props["typeFilterLevel"]=system.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
TcpChannel chan = new TcpChannel(props, clientSinkProvider, serverSinkProvider);

然后在广播给每个客户端时…
[/Quote]
谢谢,测了一下,好像不行。
wsw0515 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 XiaoMiTang 的回复:]
服务器向客户端发数据-----〉客户端从服务端取数据
[/Quote]
虽然改为客户端从服务端取数据是一种办法,但是服务器向客户端广播数据遇到断网有没有解决之道呢?
愚痴鱼 2008-10-17
  • 打赏
  • 举报
回复
服务器向客户端发数据-----〉客户端从服务端取数据
wuqiubin 2008-10-17
  • 打赏
  • 举报
回复
解决了没有啊

首先在服务器客户端设定timeout属性,如下:
IDictionary props = new Hashtable();
props["timeout"] = 30000;
props["name"] = System.Guid.NewGuid().ToString();
props["typeFilterLevel"]=system.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
TcpChannel chan = new TcpChannel(props, clientSinkProvider, serverSinkProvider);

然后在广播给每个客户端时都创建一个线程,也可以用BeginInvoke
wuqiubin 2008-10-17
  • 打赏
  • 举报
回复
解决了没有啊
没有的话,我可以帮助你
首先在服务器客户端设定timeout属性,如下:
IDictionary props = new Hashtable();
props["timeout"] = 30000;
props["name"] = System.Guid.NewGuid().ToString();
props["typeFilterLevel"]=system.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
TcpChannel chan = new TcpChannel(props, clientSinkProvider, serverSinkProvider);

然后在广播给每个客户端时都创建一个线程,也可以用BeginInvoke
szzwl 2008-10-14
  • 打赏
  • 举报
回复
没碰到过,收藏了
zbking 2008-10-14
  • 打赏
  • 举报
回复
帮顶,学习
qinhl99 2008-10-11
  • 打赏
  • 举报
回复
学习下
蓝色木 2008-10-09
  • 打赏
  • 举报
回复
顶一下
wsw0515 2008-10-07
  • 打赏
  • 举报
回复
谢谢ddkc_c
wsw0515 2008-10-06
  • 打赏
  • 举报
回复
继续等待高手的意见或建议......
DalyQiao 2008-10-06
  • 打赏
  • 举报
回复
好像只能用这种方式

delegate void WorkStarted();
delegate void WorkProgressing();
delegate void WorkCompleted();

public void DoWork()
{
...
Console.WriteLine("Worker:work completed");
if ( completed !=null )
{
foreach( WorkCompleted wc in completed.GetInvocationList() )
wc.BeginInvoke( new AsyncCallback(WorkGraded),wc );

}
}

void WorkGraded (IAsyncResult res )
{
WorkCompleted wc = (WorkCompleted)res.AsyncState;
int grade = wc.EndInvoke(res);
Console.WriteLine("Worker grade= "+grade);
}
上面的代码是从Windows Forms 程序设计中抄的,你看看其中的附录,讲的是委托编程,说的会更细致。
zhujiechang 2008-09-27
  • 打赏
  • 举报
回复
据说采用订阅事件的情况下有这个BUG,建议采用WCF。
DalyQiao 2008-09-27
  • 打赏
  • 举报
回复
我创建了一个事件,而且是静态的,不然调用完就给我销毁了,事件就没法产生了。所以有的客户端在把事件回调函数挂到NewHitchEvent事件上之后,
NewHitchEvent之上就形成一个委托链,我们对每个个委托单独进行调用,如果长时间不能调用返回,就会产生异常,超时错误!这时就把此委托从事
件的委托链中去掉,下次就不会再调用这个委托了,只是在那一刻会比较慢.

//调用事件,如果客户端异常断开,则自动去掉相应的回调
if (NewHitchEvent != null)
{
hitch.TID = iid;
hitch = GetHitch(hitch);
HitchEventHandler tempevent = null;
foreach (Delegate del in NewHitchEvent.GetInvocationList())//单独处理事件的委托链中的每一个委托
{
try
{
tempevent = (HitchEventHandler)del;
tempevent(hitch);//调用此委托,触发客户端事件
}
catch
{
NewHitchEvent -= tempevent;//因为超时异常(或客户端断网),调用失败,所以可以假定客户端已失去联系,直接去掉此委托,下次再次触发事件时便不再对此客户端的回调函数调用
}
}
}
DalyQiao 2008-09-27
  • 打赏
  • 举报
回复
找了个文章
http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx
你得使用异步操作了,关键的一个难点是你得在调用前判断在BeginInvoke之后是否操作超时,如果超时,可能需要中止异步操作,
呵呵,找了半天没找到相应的解决办法,暂不知道如何中止异步操作
wsw0515 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 LQknife 的回复:]
有个oneway属性吗不是
//调用事件,如果客户端异常断开,则自动去掉相应的回调
if (NewHitchEvent != null)
{
hitch.TID = iid;
hitch = GetHitch(hitch);
HitchEventHandler tempevent = null;
foreach (Delegate del in NewHitchEvent.GetInvocationList())
{
try…
[/Quote]
谢谢,加个oneway没什么变化啊!
LQknife 2008-09-27
  • 打赏
  • 举报
回复
有个oneway属性吗不是
//调用事件,如果客户端异常断开,则自动去掉相应的回调
if (NewHitchEvent != null)
{
hitch.TID = iid;
hitch = GetHitch(hitch);
HitchEventHandler tempevent = null;
foreach (Delegate del in NewHitchEvent.GetInvocationList())
{
try
{
tempevent = (HitchEventHandler)del;
tempevent(hitch);
}
catch
{
NewHitchEvent -= tempevent;
}
}
}
13楼的这个也很好
加载更多回复(19)

110,567

社区成员

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

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

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