繁体   English   中英

Websocket 客户端连接 c# windows forms

[英]Websocket client connection in c# windows forms

我正在寻找使用 websocket 从服务器获取数据的方法,将它们转换为.json 并将它们存储在 sqlite db 以在winforms中使用过滤数据。 我尝试了一些来自互联网的例子,但无法让它们工作。

试过这个 python 代码:

import websocket
import ssl

SOCKET = "wss://xxxxx.io:33010/ws/?EIO=3&transport=websocket"


def on_open(ws):
    print('connection: successful')

def on_close(ws, *args):
    print('connection: lost')

def on_message(ws, message):
    print(message)

def on_error(ws, message):
    print(message)

ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message, on_error=on_error)
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

并从此开源 web 链接http://livepersoninc.github.io/ws-test-page/?

从这两个我都从服务器获取数据,但我只需要在C#任何想法中类似的东西。

来自服务器的示例文本/json:

42["ticker",[{"provider":"lbank","pair":"zec_usdt","from":"ZEC","rate":126.435645,"to":"USDT","timeUtc":1651350906458,"key":"lbank:zec_usdt:1651350906458"}]]
42["ticker",[{"provider":"lbank","pair":"bch_usdt","from":"BCH","rate":285.82794,"to":"USDT","timeUtc":1651350906470,"key":"lbank:bch_usdt:1651350906470"}]]

这是使用ClientWebSocket类的一般示例( https://docs.microsoft.com/en-us/dotnet/api/system.net.websockets.clientwebsocket?view=net-6.0

var wsClient = new ClientWebSocket();

public async Task OpenConnectionAsync(CancellationToken token)
{
    //In case you need proxy
    wsClient.Options.Proxy = Proxy;

    //Set keep alive interval
    wsClient.Options.KeepAliveInterval = TimeSpan.Zero;

    //Set desired headers
    wsClient.Options.SetRequestHeader("Host", _host);

    //Add sub protocol if it's needed
    wsClient.Options.AddSubProtocol("zap-protocol-v1");

   //Add options if compression is needed
   WsClient.Options.DangerousDeflateOptions = new WebSocketDeflateOptions
   {
       ServerContextTakeover = true,
       ClientMaxWindowBits = 15
   };

   await wsClient.ConnectAsync(new Uri(_url), token).ConfigureAwait(false);
}

//Send message
public async Task SendAsync(string message, CancellationToken token)
{
    var messageBuffer = Encoding.UTF8.GetBytes(message);
    await wsClient.SendAsync(new ArraySegment<byte>(messageBuffer), WebSocketMessageType.Text, true, token).ConfigureAwait(false);
}

//Receiving messages
private async Task ReceiveMessageAsync(byte[] buffer)
{
    while (true)
    {
        try
        {
            var result = await wsClient.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None).ConfigureAwait(false);

           //Here is the received message as string
            var message = Encoding.UTF8.GetString(buffer, 0, result.Count);            
            if (result.EndOfMessage) break; 
         }
         catch (Exception ex)
         {
             _logger.LogError("Error in receiving messages: {err}", ex.Message);
             break;
         }
     }
}

public async Task HandleMessagesAsync(CancellationToken token)
{
    var buffer = new byte[1024 * 4];
    while (wsClient.State == WebSocketState.Open)
    {
        await ReceiveMessageAsync(buffer);
    }
    if (WsClient.State != WebSocketState.Open)
    {
         _logger.LogInformation("Connection closed. Status: {s}", WsClient.State.ToString());
         // Your logic if state is different than `WebSocketState.Open`
    }
}

尽管这是使用 ws 客户端的一般示例,但您可以轻松地弄清楚这个概念并使其适应您的场景。

PM> Install-Package WebSocketSharp -Pre
 
using WebSocketSharp 


        private WebSocket client;
        const string host = “ws://127.0.0.1:8000”;

        private void Form1_Load(object sender, EventArgs e)
        {
            client = new WebSocket(host);

            client.OnOpen += (ss, ee) =>
               listBox1.Items.Add(string.Format(“Connected to {0} successfully “, host));
            client.OnError += (ss, ee) =>
               listBox1.Items.Add(”     Error: “ + ee.Message);
            client.OnMessage += (ss, ee) =>
               listBox1.Items.Add(“Echo: “ + ee.Data);
            client.OnClose += (ss, ee) =>
               listBox1.Items.Add(string.Format(“Disconnected with {0}”, host));
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM