背景:服务端语言为GO,客户端语言为:C#(WinForm);在客户端操作后,服务器会产生一些消息,需要将这些消息实时的传递给客户端。
一、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"; IPAddress iPAddress = Dns.GetHostAddresses(addrStr)[0]; TcpListener server = new TcpListener(iPAddress, 8899); 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}:8899", 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:8899/") prosumer2 := push.NewProsumer(client2, "发送方1") time.Sleep(time.Millisecond * 100) prosumer2.Push("人来了1a", "log_msg", "C#") prosumer2.Push("人来了2c", "log_msg", "C#") }View Code