C# 窗体程序 websocket 给winForm的控件值传

fxsee3 2018-02-03 12:57:28
用 WebSocketSharp 实现客户端
要实现WebSocketService中的onReceive 方法,WebSocket 返回数据由此函数接收。
原例是控件台输出收到的信息,现在想在窗体客户端实现输出收到的信息,WebSocket 是异步连接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebSocketSharp;
using System.IO;
using System.Threading;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
namespace websocket
{
class WebSocketBase
{
private WebSocket webSocketClient = null;
private WebSocketService webService = null;
private Boolean isRecon = false;
private string url = null;
private System.Timers.Timer t = new System.Timers.Timer(2000); //
public WebSocketBase(string url, WebSocketService webService)
{
this.webService = webService;
this.url = url;
}
public void start()
{
webSocketClient = new WebSocket(url);
webSocketClient.OnError += new EventHandler<WebSocketSharp.ErrorEventArgs>(webSocketClient_Error);
webSocketClient.OnOpen += new EventHandler(webSocketClient_Opened);
webSocketClient.OnClose += new EventHandler<WebSocketSharp.CloseEventArgs>(webSocketClient_Closed);
webSocketClient.OnMessage += new EventHandler<MessageEventArgs>(webSocketClient_MessageReceived);
webSocketClient.ConnectAsync();
while (!webSocketClient.IsAlive)
{
// Console.WriteLine("Waiting WebSocket connnet......");
Thread.Sleep(1000);
}
t.Elapsed += new System.Timers.ElapsedEventHandler(heatBeat);
t.Start();
}

private void heatBeat(object sender, System.Timers.ElapsedEventArgs e)
{
this.send("{'event':'ping'}");
}
private void webSocketClient_Error(object sender, WebSocketSharp.ErrorEventArgs e)
{

}
private void webSocketClient_MessageReceived(object sender, MessageEventArgs e)
{
webService.onReceive(e.Data);
}

private void webSocketClient_Closed(object sender, WebSocketSharp.CloseEventArgs e)
{
if (!webSocketClient.IsAlive)
{
isRecon = true;
webSocketClient.ConnectAsync();
}
}
public string Decompress(byte[] baseBytes)
{
string resultStr = string.Empty;
using (MemoryStream memoryStream = new MemoryStream(baseBytes))
{
using (InflaterInputStream inf = new InflaterInputStream(memoryStream))
{
using (MemoryStream buffer = new MemoryStream())
{
byte[] result = new byte[1024];

int resLen;
while ((resLen = inf.Read(result, 0, result.Length)) > 0)
{
buffer.Write(result, 0, resLen);
}
resultStr = Encoding.Default.GetString(result);
}
}
}
return resultStr;
}
private void webSocketClient_Opened(object sender, EventArgs e)
{
this.send("{'event':'ping'}");
}

public Boolean isReconnect()
{
if (isRecon)
{
if (webSocketClient.IsAlive)
{
isRecon = false;
}
return true;
}
return false;
}
public void send(string channle)
{
webSocketClient.Send(channle);
}
public void stop()
{
if (webSocketClient != null)
webSocketClient.Close();
}

}
interface WebSocketService
{
void onReceive(String msg);
}
}


以下控制台输出接收的信息,


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp1;

namespace websocket
{
class BuissnesServiceImpl:WebSocketService
{
public void onReceive(string msg)
{
Console.WriteLine(msg); //这 是控制台输出,如改winForm输出该如何写,因为是异步连接,如何值传给Form里的控件
}

}
}


控制台程序如下:

string url = "wss://real.okex.com:10441/websocket";

WebSocketService wss = new BuissnesServiceImpl();
WebSocketBase wb = new WebSocketBase(url, wss);
wb.start();

wb.send("{'event':'addChannel','channel':'ok_sub_spot_btc_usdt_deals'}");
Console.ReadKey();
wb.stop();



现在想在winform的textBox里输出信息,该如何改写,websocket是异步连接,对多线程操作不是很熟悉,所以请教各位大牛
...全文
2653 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2018-02-03
  • 打赏
  • 举报
回复
用signalr,它本身底层适配websocket tcp/ip等,你的程序不用管了。
  • 打赏
  • 举报
回复
引用 1 楼 fxsee3 的回复:
我自己写 窗体程序,但不知接下来如何做, 该如何改写 BuissnesServiceImpl,
一个好的服务功能总是要进行事件通知的。例如你看到微软的 TextBox 等等基本控件按,都有必要的一些事件设计。 而你用的这个所谓 WebSocketSharp 框架程序,假设它只有 onReceive 重写方法的设计,却没有事件通知设计,那么其实它有点繁琐、多余这个类型、不实用。
  • 打赏
  • 举报
回复
单从你贴出的代码
    class BuissnesServiceImpl:WebSocketService
    {
        public void onReceive(string msg)
        {
            Console.WriteLine(msg);  //这 是控制台输出,如改winForm输出该如何写,因为是异步连接,如何值传给Form里的控件
        }
 
    }
这里来看,这个类设计得比较封闭,不具有事件通知功能。需要为其功能接口定义一个事件通知功能,例如:
    class BuissnesServiceImpl : WebSocketService
    {
        public void onReceive(string msg)
        {
            if (this.MessageReceived != null)
                this.MessageReceived(msg);
        }

        public event Action<string> MessageReceived;

    }
这样在你的 Form1 中捕获 ws.MessageReceived 通知,并且显示内容结果。
fxsee3 2018-02-03
  • 打赏
  • 举报
回复
我自己写 窗体程序,但不知接下来如何做, 该如何改写 BuissnesServiceImpl,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace websocket
{
    public partial class Form1 : Form
    {

        private WebSocketBase wb;
        private WebSocketService wss;
        public delegate void setTextDelegate(string msg);
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string url = "wss://real.okex.com:10441/websocket";
            wss = new BuissnesServiceImpl();
            
            wb = new WebSocketBase(url, wss);
            wb.start();

            wb.send("[{'event':'addChannel','channel':'ok_sub_spot_btc_usdt_deals'}]");

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            wb.stop();
        }

        private void setText(string text) 
        {
            this.textBox1.Text = text;
        }

        public void UIHandler(string msg)
        {
            if (this.textBox1.InvokeRequired)
            {
                this.textBox1.Invoke(new setTextDelegate(setText), new object[] { msg });
            }
        }
    }
}

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧