17,740
社区成员
发帖
与我相关
我的任务
分享
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();
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 通知,并且显示内容结果。
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 });
}
}
}
}