2014-09-29 105 views
1

我有一个TcpClient对此我连接到本机和一切工作fine.Now一个额外的步骤,我想每timer.As的帮助来监控非常60秒的连接状态话题我才知道,有没有直接的方法来测试它。所以我试图通过发送到机器的最近消息的响应时,应用程序就会从网络中得到它的基础研究。TcpClient的连接状态问题

这里是代码..

// Find out whether the socket is connected to the remote host. 

//Send a message to Machine 
try 
{ 
    byte[] notify = Encoding.ASCII.GetBytes("Hello"); 
    stream.Write(notify, 0, notify.Length);  
}catch { } 

//Check if it reached to machine or failed 
bool getConnectionStatus = client.Connected; 

if (getConnectionStatus == true) 
    { 
     //Do nothing 
    } 
else 
    { 
     //Stop the thread 
     _shutdownEvent.WaitOne(0); 
     _thread.Abort(); 

     //Start Again 
     _thread = new Thread(DoWork); 
     _thread.Start(); 
     } 

但是,在这种情况下发生的最令人惊讶的事情是,如果机器是从网络中则也同时写了第一次能写而这就是为什么连接状态来作为连接虽然是出了network.Second时候,它正试图发送失败的数据和预期的一样状态为断开。

我面临的主要问题是,一旦它从网络上断开连接,为什么它能够发送数据。由于这个,我丢失了当网络运行时存储在机器中的所有缓冲区数据关闭。 请帮助我..

+0

发送一个“PING”,等待一个“PONG” – 2014-09-29 13:22:12

+0

@AlexK。很抱歉,我没有得到你 – 2014-09-29 13:34:33

回答

1

引擎盖下,该Write操作只是将数据发送到网络层;在尝试传输数据之前,您可能会获得“成功”结果。如果数据很小,网络层甚至可能会延迟发送数据一段时间,试图一次发送一批一批的几条消息。

什么亚历克斯K.几句说的是,检查网络连接的最可靠的办法就是等待响应。如果在一段时间内没有收到这样的回应,则连接丢失。

比方说,你继续使用“你好”,服务器应响应“是啊!”。在客户端,你可以用你的扩展当前的代码:

try 
{ 
    byte[] notify = Encoding.ASCII.GetBytes("Hello"); 
    stream.Write(notify, 0, notify.Length); 
    byte[] notifyResult = new byte[5]; 
    int bytesRead = stream.Read(notifyResult, 0, 5); 
    if (bytesRead == 0) 
    { 
     // No network error, but server has disconnected 
    } 

    // Arriving here, notifyResult should contain ASCII "Yeah!" 
} 
catch (SocketException) 
{ 
    // Network error 
} 

在服务器上,你应该认识到“你好”正在发送,并简单地响应“是啊!”。我不知道你的服务器当前的做法,但它可能是类似于:

switch (receivedMessage) 
{ 
    case "Hello": 
     stream.Write(Encoding.ASCII.GetBytes("Yeah!"), 0, 5); 
     break; 
} 

请注意,你应该考虑在信息包包裹邮件,即:

<Message Type> <Message> <Terminator Character> 
ie. "KHello\n" 

或者

<Size of Message> <Message Type> <Message> 
ie. "0005KHello" 

当消息类型“K”是一个保活消息,换行符“\ n”个的终止符和“0005”的消息长度不含吨他的消息类型。

这样服务器总是能够判断它是否已收到完整的消息,并且消息类型可以指示“Hello”是作为数据还是作为保活数据包发送的。

+0

你可以请给我的例子或psudocode连接到我的代码在post.Activeually我是新的领域,所以没有明确的条款 – 2014-09-29 13:56:44

+0

@shubhamHegdey增加了一个例子。我希望你能用它取得一些进展。 – 2014-09-29 14:18:45