仅供参考:未经允许,不得转载。
前段时间在做WCF开发的过程中,用户需要在服务端对客户端进行监控,需要知道客户端什么时候上线,什么时候下线,当然服务端也可以给客户端推送信息,就是所谓的双向通信了。
要双向通信用我以前的HTTP协议是行不通了,问了一下别人,别人说了一个“心跳更新”这个概念,想必大家都懂这个吧,大概意思呢就是A向B定时发送一个消息来监测B是否活着,如果活着就返回一个消息,死掉当然就不需要了,其实我觉得心跳更新就是TCP协议,也就是双向通信,互相监测活着或者死掉。
行了,废话不多说了,先让大家看下效果:
客户端:
客户端没有多少内容,就是引用一下服务端服务(WCF服务),并调用服务的方法。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
namespace WinTestTcp
{
public partial class ClientFrm : Form,MessageService.IMessageServiceCallback
{
private MessageService.MessageServiceClient mService = null;
public ClientFrm()
{
InitializeComponent();
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ClientFrm_Load(object sender, EventArgs e)
{
InstanceContext context = new InstanceContext(this);
mService = new MessageService.MessageServiceClient(context);
mService.Register();
}
/// <summary>
/// 收到服务器消息
/// </summary>
/// <param name="message"></param>
public void SendMessage(string message)
{
SetDisplayMessage("服务器:"+message);
}
/// <summary>
/// 设置显示消息
/// </summary>
private void SetDisplayMessage(string message)
{
if (this.rtxtResult.InvokeRequired)
{
this.rtxtResult.BeginInvoke(new MethodInvoker(delegate
{
SetDisplayMessage(message);
}));
}
else{
this.rtxtResult.Text += string.Format("{0}\r\n{1}\r\n",message,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
/// <summary>
/// 发送事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
mService.ClientSendMessage(this.textBox1.Text);