2016-09-18 102 views
0

我正在使用NetMQ套接字来执行客户端 - 服务器通信。我有一台监听端口5555和一台客户端的服务器,即.bind() -s。如何确定客户端套接字的连接状态?

这里是我的代码示例:

using (NetMQContext ctx = NetMQContext.Create()) 
{ 
    using (var client = ctx.CreateRequestSocket()) 
    {        
      client.Connect("tcp://127.0.0.1:5555");        
      client.SendFrame(jData);        
    } 
} 

我想这样做是为了传达给用户,如果客户端没有找到任何服务器侦听到该端口。

实际发生的事情是,如果没有服务器正在侦听该端口,则不会引发异常,并调用.sendFrame()并导致应用程序崩溃。

是否有任何方法,如异常或状态码,可以告诉我,如果连接成功或不?

+0

你可以要求连接的属性,这将强制连接创建或失败。例如,你可以要求从本地客户端的TCP/IP连接ID,这可能会强制连接打开 –

+0

我试图找到一些属性或方式来沟通,如果连接不可能。根据我的理解,zeromq/netmq框架没有通知。无论客户端还是服务器先连接,图书馆都会尝试尽可能地连接 – Snake

回答

1

做到这一点的最佳方法是响应超时。 因此发送请求(超时),然后等待响应超时。如果服务器在超时时间内没有响应,则可以尝试连接到下一台服务器。像这样:

if (client.TrySendFrame(TimeSpan.FromSeconds(2), jData) && 
    client.TryReceiveFrame(TimeSpan.FromSeconds(2), out jData)) 
{ 
    // Server is online 
} 
else 
{ 
    // Server is down 
} 
+0

太棒了!但是,当我检查超时内的响应,如果没有发送响应应用程序崩溃。如果检查为false,则执行跳至else语句,该语句应该向调用者返回一个false或其他任何其他消息。它看起来像线程卡住,并没有回到调用者 – Snake

+0

我不知道我明白,在if语句中,你已经在jData中的响应。你会得到什么例外? – somdoron

+0

我想,如果服务器停机,要停止并退出该功能,请继续使用我的代码。但在这种情况下(服务器关闭),如果我返回给调用者与其他{返回false;}应用程序卡住了。在一般的调试中,我注意到当离开使用语句而没有收到服务器的响应时,应用程序被卡住了。我不是英语,所以希望很清楚 – Snake

相关问题