0

我正在为 nodejs 中实现的服务器设置 C# websocket 客户端(使用 socket.io)。使用[Websocket4net]:https ://github.com/kerryjiang/WebSocket4Net 。我的代码能够与套接字服务器连接,但 WebClient.Send("message") 不会调用服务器事件。我被困在使用 websocket4net lib 从服务器发送消息或调用事件。我选择这个库是因为我的实现是在框架 2.0 或更低版本中。

我尝试使用 websocket.send("message") 在连接后调用消息事件,但在服务器上无法识别。在服务器调用函数失败。还研究了执行命令,但无法在我的课堂上实现这一点。

public class JniorWebSocket : IDisposable
{
    //public delegate void LogEventHandler(object sender, LogEventArgs args);
    //public event LogEventHandler Log;
    public event EventHandler Connected;
    public event EventHandler Disconnected;

    private WebSocket _websocket;
    private string _uri;
    private string sid;

    public JniorWebSocket(string host) : this(host, 0) { }

    public JniorWebSocket(string host, int port)
    {
        _uri = "ws://" + host;
        if (0 != port) _uri += ":" + port + "/join/?EIO=3&transport=websocket";

        _websocket = new WebSocket(_uri);
        _websocket.Opened += new EventHandler(websocket_Opened);
        _websocket.Error += Websocket_Error;
        _websocket.Closed += websocket_Closed;
        _websocket.MessageReceived += Websocket_MessageReceived;

        _websocket.Open();
    }

    public void Dispose()
    {
        _websocket.Dispose();
        GC.SuppressFinalize(this);
    }
    public bool AllowUnstrustedCertificate
    {
        get
        {
            return _websocket.AllowUnstrustedCertificate;
        }
        set
        {
            _websocket.AllowUnstrustedCertificate = value;
        }
    }

    public void Connect()
    {
        _websocket.Open();
        while (_websocket.State == WebSocketState.Connecting) { };
        if (_websocket.State != WebSocketState.Open)
        {
            throw new Exception("Connection is not opened.");
        }
    }

    public void Close()
    {
        _websocket.Close();
    }

    public void Send(string message)
    {
        try
        {
            _websocket.Send(message);
        }
        catch (Exception ex)
        {
        }
    }
    private void Websocket_Error(object sender, ErrorEventArgs e)
    {
    }

    private void Websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        if (e.Message.IndexOf("{") != -1)
        {
            var json = JObject.Parse(e.Message.Substring(e.Message.IndexOf("{")));

            sid = json["sid"].ToString();

            Console.WriteLine(sid);
            if ("Error".Equals(sid)) HandleErrorMessage(json);
        }
    }
    private void HandleErrorMessage(JObject json)
    {
    }
    private void websocket_Opened(object sender, EventArgs e)
    {
        Connected?.Invoke(this, EventArgs.Empty);
        Send(string.Empty);
    }

    private void websocket_Closed(object sender, EventArgs e)
    {
        Disconnected?.Invoke(this, EventArgs.Empty);
    }
}

从我的主要调用这个类

JniorWebSocket jniorWebSocket = new JniorWebSocket(uri, port);
jniorWebSocket.AllowUnstrustedCertificate = true;
jniorWebSocket.Connect();
jniorWebSocket.Send("message");

nodejs端的socket.io

const server = require('http').Server(app);
global.socketIO = SocketIO(server, { path: '/join' });
global.socketIO.on('connection', (socket) => 
{
    socket.on('message',async (data) => {
        console.info(data);
    });
    socket.on('authenticate', async (data) => {
        try {
             }
        } catch(error) {
            console.warn('Error while authenticating socket', error);
        }
    });
});

我是这个 websocket C# 实现的新手,不知道如何调用服务器事件,之后我也会在客户端编写一些事件。期望从客户端调用所有服务器事件。

4

1 回答 1

1

它适用于桌面应用程序和 xamarin.android 应用程序

我已经使用了这个库,即使它已被弃用 https://github.com/Quobject/SocketIoClientDotNet

你可以直接从nuget安装Install-Package SocketIoClientDotNet

using Quobject.EngineIoClientDotNet.Client.Transports;
using Quobject.SocketIoClientDotNet.Client;



     var option = new IO.Options()
                {
                  QueryString = "Type=Desktop",
                  Timeout = 5000,
                  ReconnectionDelay = 5000,
                  Reconnection = false,                   
                  ransports = Quobject.Collections.Immutable.ImmutableList.Create<string>(PollingXHR.NAME)
                };

                socket = IO.Socket("http://localhost:1453",option);
                socket.On(Socket.EVENT_CONNECT, () =>
                {
                    socket.Emit("iAmOnline", "1234");

                });
                socket.On("youAreOnline", () =>
                {
                    Console.WriteLine("I am Online");
                });

                socket.On("hi", (data) =>
                {
                    Console.WriteLine(data);
                    socket.Disconnect();
                });

您可以根据需要添加任何传输。由于防火墙,我添加了 xhr-polling。您可以使用 WebSocket.NAME 和/或 Polling.NAME

于 2019-07-16T07:38:18.847 回答