从go程序中发消息给winform(C#)
阅读原文时间:2023年07月08日阅读:3

背景:

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
*/