从go程序中发消息给winform(C#)

背景:

1、服务端语言为GO,客户端语言为:C#(WinForm);

2、在客户端操执行长耗时任务时,服务器应该将后台日志或定时将心跳信息及时传递给客户端,这样方便用户查看服务器执行情况(重要)。

一、C#核心代码(启动的是订阅服务端)

 

using Hprose.RPC;
using Hprose.RPC.Plugins.Log;
using Hprose.RPC.Plugins.Push;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace win_push_msg_client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void 测试ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            callAppendLog("开始");

            Task.Factory.StartNew(() =>
            {
                try
                {
                    #region
                    // 服务端启动
                    //string addrStr = "127.0.0.1";//要其它机器访问,则不能用本机
                    string addrStr = "192.168.17.101";
                    IPAddress iPAddress = Dns.GetHostAddresses(addrStr)[0];
                    TcpListener server = new TcpListener(iPAddress, 8888);
                    server.Start();
                    var service = new Broker(new Service()).Service;
                    ServiceCodec.Instance.Debug = true;
                    service.Use(Log.IOHandler)
                           .Use(Log.InvokeHandler)
                           .Bind(server);
                    // 启动订阅服务
                    var client = new Client(string.Format("tcp4://{0}:8888", addrStr));
                    var prosumer = new Prosumer(client, "C#");
                    prosumer.OnSubscribe += (topic) => {
                        this.callAppendLog(topic + " 订阅成功.");
                    };
                    prosumer.OnUnsubscribe += (topic) => {
                        this.callAppendLog(topic + " 取消订阅成功");
                    };
                    prosumer.Subscribe<string>("log_msg", (data) => {
                        this.callAppendLog(data);
                    });
                    this.callAppendLog("已订阅主题:log_msg");

                    #endregion
                }
                catch (Exception ex)
                {
                    this.callAppendLog(ex.Message);
                }
            });
        }

        private void callAppendLog(string msg)
        {
            this.Invoke(new Action(() => {
                this.richTextBox1.AppendText(msg);
                this.richTextBox1.AppendText("\n");
            }));
        }
    }
}

 

二、GO核心代码:

package main

import (
    "github.com/hprose/hprose-golang/v3/rpc"
    "github.com/hprose/hprose-golang/v3/rpc/plugins/push"
    "time"
)

func main()  {
    //client2 := rpc.NewClient("tcp4://127.0.0.1:8888/")
    client2 := rpc.NewClient("tcp4://192.168.17.101:8888/")
    prosumer2 := push.NewProsumer(client2, "发送方1")
    time.Sleep(time.Millisecond * 100)
    prosumer2.Push("人来了1a", "log_msg", "C#")
    prosumer2.Push("人来了2c", "log_msg", "C#")
}
/*
https://github.com/hprose/hprose-golang/blob/v3/rpc/rpc_test.go#L768

包:github.com/hprose/hprose-golang/v3
*/

 

posted @ 2021-11-03 21:29  xiaoyongdata  阅读(199)  评论(0编辑  收藏  举报