如何判断remoting的客户端已经连接上服务端

五位数 2010-10-21 04:21:18
是这样。我的远程对象是在服务端上实例化的。
然后客户端获得这个远程对象的代理。
现在客户端需要在服务端上注册自己。
可是如果服务端并没有起来。客户端是不能在服务器上注册自己的。也就是连接不到服务器
所以我需要知道客户端是否实时的能够连接到服务器。
希望懂的朋友给点提示
...全文
614 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
五位数 2010-10-26
  • 打赏
  • 举报
回复
能否在remoting上给出解决办法
烈火蜓蜻 2010-10-25
  • 打赏
  • 举报
回复
直接使用就是了,如果抛异常那就是没连接上,这不就简单了
  • 打赏
  • 举报
回复
记不大清了,
1:无论服务器是否在线,客户端的代理对象好像都是可以创建的。
2:保险的做法是,远程端提供一个void IsOnline()函数,每隔1分钟(或你需要的时间段)调用一次,如果,没抛错,就在线。
3:C#是无法完全意义上实现检测实时在线的,比如远程机器网线断开或死机,就不会立刻通知到本机,必须使用2中的心跳办法。
至于心跳,给你个例子:
模拟通信中的客户端。客户端在运行过程中,服务器每隔一段的时间会给客户端发送心跳数据。客户端启动一个线程,每3秒检测是否收到心跳数据,如果没有心跳数据,则告诉自己已经和服务器断开连接。代码如下:

Thread t;
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);

private void button1_Click(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(delegate
{
while (true)
{
//等3秒,3秒没有信号,显示断开
//有信号,则显示更新
bool re = _autoResetEvent.WaitOne(3000);
ShowRe(re);
}
}));
t.Start();
t.IsBackground = true;
}

void ShowRe(bool re)
{
label1.BeginInvoke(new MethodInvoker(delegate
{
if (re)
{
label1.Text = DateTime.Now.ToString() + "保持连接状态";
}
else
{
label1.Text = DateTime.Now.ToString() + "断开,需要重启";
}
}));
}

//模拟服务器发送心跳数据。
private void button2_Click(object sender, EventArgs e)
{
_autoResetEvent.Set();
}
五位数 2010-10-25
  • 打赏
  • 举报
回复
继续等待明白人来
五位数 2010-10-25
  • 打赏
  • 举报
回复
还是无人关注啊。。。。。
guyehanxinlei 2010-10-25
  • 打赏
  • 举报
回复
使用WCF吧
gongsun 2010-10-25
  • 打赏
  • 举报
回复
没有办法保证能够实时检查服务器是否可用

-------------------------------------

写个服务,用个线程 每隔30秒 调用一次。
五位数 2010-10-25
  • 打赏
  • 举报
回复
WCF没用过哦。刚开始弄remoting。了解的话。给点建议呗
zjx198934 2010-10-25
  • 打赏
  • 举报
回复
有wcf都包装好了! 何必用removting呢!
五位数 2010-10-25
  • 打赏
  • 举报
回复
要沉。顶起来
五位数 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luminji 的回复:]
记不大清了,
1:无论服务器是否在线,客户端的代理对象好像都是可以创建的。
2:保险的做法是,远程端提供一个void IsOnline()函数,每隔1分钟(或你需要的时间段)调用一次,如果,没抛错,就在线。
3:C#是无法完全意义上实现检测实时在线的,比如远程机器网线断开或死机,就不会立刻通知到本机,必须使用2中的心跳办法。
至于心跳,给你个例子:
模拟通信中的客户端。客户端在运行过程中……
[/Quote]

感谢您的回复。但是似乎我的问题更严重一些。
我用的是remoting
我发一下我的代码

服务端:
public void Start(int port)
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();
props["port"] = port;
HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel, false);
this.manager = new Manager();
ObjRef objRef = RemotingServices.Marshal(this.manager, "BroadCastMessage.soap");
}
服务端为监听。客户端是不监听的。
this.manager是远程对象
这个对象是在服务端实例化的。客户端拿到的是他的一个代理

客户端代码:

private void init()
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();
props["port"] = 0;
HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel, false);
this.manager = (IManager)Activator.GetObject(
typeof(IManager), "http://192.168.0.1:9999/BroadCastMessage.soap");


this.wrapper = new EventWrapper();
this.wrapper.Ip = this.GetLocalhostIp();

this.wrapper.RequestSendMessageEvent += new RequestSendMessageEventArgsHandler(this.CreateFile);
this.wrapper.SendMessageEvent += new SendMessageEventArgsHandler(this.WriteFile);
this.wrapper.SendMessageFinishEvent += new SendMessageFinishEventArgsHandler(this.WriteEnd);
this.wrapper.CancelSendMessageEvent += new CancelSendMessageEventArgsHandler(this.CancelWrite);
}
客户端初始化部分。
然后执行
pubilc void connect()
{
this.manager.AddClient(this.wrapper);
}
这个是把客户端订阅三个事件的wrapper对象增加到服务端里
只有执行manager这个远程对象的代理的方法,才能检测出来是否失去了于服务器的链接。

当然我可以在manager里随便定义一个方法。隔一段事件执行一下。看是否成功。成功就是服务器在线,反之失败就是服务端不存在
可是我试写了一下。没有办法保证能够实时检查服务器是否可用。
五位数 2010-10-22
  • 打赏
  • 举报
回复
无人关注吗?

111,129

社区成员

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

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

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