异步客户端SOCKET怎么实现不停的接收服务器端发送的数据?

时间:2021-05-19 05:50:34
Socket初学者请教各位老鸟:
我有一个需求,服务器端Socket在11000监听,当客户端连接上服务器端以后,服务器端开始向客户端发送心跳帧,心跳帧的频率是5秒,双方通过心跳帧确立连接有效。
连接确立后,服务器端开始向客户端发送数据,客户端收到数据后立即向服务器端返回收到的数据,服务器端收到客户端返回的刚才发送的数据后即可认为客户端已经收到这条数据,即开始发送下一条数据,否则重复发送上一条数据,在这个过程中若10秒钟内没有收到心跳帧,则认为连接已经中断。
服务器端的程序是另一方提前开发好的,现在需要建立客户端。
我的思路是使用异步SOCKET,因为在同步方式试验中发现,由于心跳帧的时间较短,如果用同步SOCKET则阻塞的时间会超时。
现在的问题是我对程序架构没有清晰的思路:
1、客户端如何不停的接收服务器端发送的数据?
我在MSDN示例代码上加了个While,提示我“您的主机中的软件放弃了一个已建立的连接”
While (true)
            {
                // Send test data to the remote device.
                Send(client, "This is a Client!!!<EOF>");
                sendDone.WaitOne();

                // Receive the response from the remote device.
                Receive(client);
                receiveDone.WaitOne();

                // Write the response to the console.
                Console.WriteLine("Response received : {0}", response);

            }
2、怎样实现5秒钟的心跳帧发送频率?
3、怎样实现客户端发送心跳帧的过程中检测服务器心跳帧的返回,若超过10秒没有收到,则重新连接Socket?

11 个解决方案

#1


顶起!

#2


顶起!

#3


1、心跳频主要是确定连接情况,换句话就是一般的在线情况,而且基本上都属于异步。
2、当发送和接收数据时,如果是网络问题,无论有没有心跳频都会产生异常,
所以不是简单的以心跳频来进行确认是否收到这个数据,因为socket连接产生的异常时间会比较长,
所以心跳频应该是你发送数据的条件,而不能是收到数据的条件。

#4


这个是不是需要多线程异步?

#5


1、心跳频主要是确定连接情况,换句话就是一般的在线情况,而且基本上都属于异步。 
2、当发送和接收数据时,如果是网络问题,无论有没有心跳频都会产生异常, 
所以不是简单的以心跳频来进行确认是否收到这个数据,因为socket连接产生的异常时间会比较长, 
所以心跳频应该是你发送数据的条件,而不能是收到数据的条件。

#6


楼上这样复制人家的回答算不算是恶意回复?
应该搞个减分的功能~嘿嘿!

#7


1.beginreceive callbackfunction

2.callback 
callbackfunction
{
  1.endreceive
  2.beginreceive callbackfunction  //形成递归
}

发送和上面原理是一样的.

#8


1.beginreceive callbackfunction 

2.callback 
callbackfunction 

  1.endreceive 
  2.beginreceive callbackfunction  
}

#9


原来是用递归实现循环,谢谢楼上的,有没有哪位老鸟给个我这个需求中的心跳帧监测的程序框架?不胜感激啊!

#10


自己解决了~多方面的原因造成了这个问题~哎~CSDN啊~今不如昔~

#11


自己解决了~多方面的原因造成了这个问题~哎~CSDN啊~今不如昔~

#1


顶起!

#2


顶起!

#3


1、心跳频主要是确定连接情况,换句话就是一般的在线情况,而且基本上都属于异步。
2、当发送和接收数据时,如果是网络问题,无论有没有心跳频都会产生异常,
所以不是简单的以心跳频来进行确认是否收到这个数据,因为socket连接产生的异常时间会比较长,
所以心跳频应该是你发送数据的条件,而不能是收到数据的条件。

#4


这个是不是需要多线程异步?

#5


1、心跳频主要是确定连接情况,换句话就是一般的在线情况,而且基本上都属于异步。 
2、当发送和接收数据时,如果是网络问题,无论有没有心跳频都会产生异常, 
所以不是简单的以心跳频来进行确认是否收到这个数据,因为socket连接产生的异常时间会比较长, 
所以心跳频应该是你发送数据的条件,而不能是收到数据的条件。

#6


楼上这样复制人家的回答算不算是恶意回复?
应该搞个减分的功能~嘿嘿!

#7


1.beginreceive callbackfunction

2.callback 
callbackfunction
{
  1.endreceive
  2.beginreceive callbackfunction  //形成递归
}

发送和上面原理是一样的.

#8


1.beginreceive callbackfunction 

2.callback 
callbackfunction 

  1.endreceive 
  2.beginreceive callbackfunction  
}

#9


原来是用递归实现循环,谢谢楼上的,有没有哪位老鸟给个我这个需求中的心跳帧监测的程序框架?不胜感激啊!

#10


自己解决了~多方面的原因造成了这个问题~哎~CSDN啊~今不如昔~

#11


自己解决了~多方面的原因造成了这个问题~哎~CSDN啊~今不如昔~