【问题标题】:Communicating with a socket.io server via c#通过 c# 与 socket.io 服务器通信
【发布时间】:2011-09-23 21:34:59
【问题描述】:

是否有遵循 socket.io 协议的 c# 客户端?我有一个 socket.io 服务器,它通过网站与 socket.io javascript 客户端通信,但我还需要连接一个可以发送和接收消息的 c# 片段。目前有没有一种干净的方法可以做到这一点,或者我必须编写自己的客户端。

【问题讨论】:

标签: c# sockets client websocket socket.io


【解决方案1】:

codeplex 上有一个项目(NuGet 也是如此),它是 socket.io 的 C# 客户端。 (我是这个项目的作者——所以我有偏见)我无法在客户端中找到我需要的确切内容,所以我构建了它并将其重新公开发布。

示例客户端样式:

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

【讨论】:

  • 我迫不及待想试一试。谢谢
  • 哇哦!谢谢吉姆,今晚我要试一试!星期六晚上计划我太酷了。这是在github上吗?这个运行也可以在客户端配置文件 4.0 上找到吗?
  • 吉姆,你的图书馆简直太棒了!这解决了我必须将本地打印机与云节点应用程序连接的许多问题。
  • 我很确定这个客户端与 socket.io 服务器不兼容 > v1.0。
  • 投反对票:这个项目已经多年没有维护了。应该接受 websocket-sharp 答案。
【解决方案2】:

使用以下库:https://github.com/sta/websocket-sharp 它可以通过 NuGet 获得:

PM> Install-Package WebSocketSharp -Pre

要连接到 Socket.IO 1.0 + 服务器,请使用以下语法:

using (var ws = new WebSocket("ws://127.0.0.1:1337/socket.io/?EIO=2&transport=websocket"))
{
    ws.OnMessage += (sender, e) =>
      Console.WriteLine("New message from controller: " + e.Data);

    ws.Connect();
    Console.ReadKey(true);
}

换句话说,将其附加到 localhost:port -“socket.io/?EIO=2&transport=websocket”。

我的完整服务器代码:https://gist.github.com/anonymous/574133a15f7faf39fdb5

【讨论】:

  • 如果不提前知道端口你会怎么做?
  • 我刚刚意识到这并不重要,因为站点地址实际上会将其定向到服务器端的正确端口
  • 如何使用它连接到房间并阅读特定消息?以及如何在断开连接时重试?
  • 我怎样才能做到这一点,io.emit('chat message', message);我试过 ws.send("some string") 但这会关闭当前的套接字连接,并且服务器上没有收到消息,而且“聊天消息”如何传递这个事件名称。
  • @AniketBhansali 要使用 io.emit 之类的东西,您需要创建自己的包装器。或者最好你需要使用 JSON 字符串传递 ws.send 并在客户端反序列化以找出消息室。
【解决方案3】:

这个包支持最新的协议。
Github - https://github.com/HavenDV/H.Socket.IO/
C# 现场示例 - https://dotnetfiddle.net/FWMpQ3/
VB.NET 现场示例 - https://dotnetfiddle.net/WzIdnG/
努吉特:

Install-Package H.Socket.IO
using System;
using System.Threading.Tasks;
using H.Socket.IO;

#nullable enable

public class ChatMessage
{
    public string? Username { get; set; }
    public string? Message { get; set; }
    public long NumUsers { get; set; }
}
    
public async Task ConnectToChatNowShTest()
{
    await using var client = new SocketIoClient();

    client.Connected += (sender, args) => Console.WriteLine($"Connected: {args.Namespace}");
    client.Disconnected += (sender, args) => Console.WriteLine($"Disconnected. Reason: {args.Reason}, Status: {args.Status:G}");
    client.EventReceived += (sender, args) => Console.WriteLine($"EventReceived: Namespace: {args.Namespace}, Value: {args.Value}, IsHandled: {args.IsHandled}");
    client.HandledEventReceived += (sender, args) => Console.WriteLine($"HandledEventReceived: Namespace: {args.Namespace}, Value: {args.Value}");
    client.UnhandledEventReceived += (sender, args) => Console.WriteLine($"UnhandledEventReceived: Namespace: {args.Namespace}, Value: {args.Value}");
    client.ErrorReceived += (sender, args) => Console.WriteLine($"ErrorReceived: Namespace: {args.Namespace}, Value: {args.Value}");
    client.ExceptionOccurred += (sender, args) => Console.WriteLine($"ExceptionOccurred: {args.Value}");
    
    client.On("login", () =>
    {
        Console.WriteLine("You are logged in.");
    });
    client.On("login", json =>
    {
        Console.WriteLine($"You are logged in. Json: \"{json}\"");
    });
    client.On<ChatMessage>("login", message =>
    {
        Console.WriteLine($"You are logged in. Total number of users: {message.NumUsers}");
    });
    client.On<ChatMessage>("user joined", message =>
    {
        Console.WriteLine($"User joined: {message.Username}. Total number of users: {message.NumUsers}");
    });
    client.On<ChatMessage>("user left", message =>
    {
        Console.WriteLine($"User left: {message.Username}. Total number of users: {message.NumUsers}");
    });
    client.On<ChatMessage>("typing", message =>
    {
        Console.WriteLine($"User typing: {message.Username}");
    });
    client.On<ChatMessage>("stop typing", message =>
    {
        Console.WriteLine($"User stop typing: {message.Username}");
    });
    client.On<ChatMessage>("new message", message =>
    {
        Console.WriteLine($"New message from user \"{message.Username}\": {message.Message}");
    });
    
    await client.ConnectAsync(new Uri("wss://socketio-chat-h9jt.herokuapp.com/"));

    await client.Emit("add user", "C# H.Socket.IO Test User");

    await Task.Delay(TimeSpan.FromMilliseconds(200));

    await client.Emit("typing");

    await Task.Delay(TimeSpan.FromMilliseconds(200));

    await client.Emit("new message", "hello");

    await Task.Delay(TimeSpan.FromMilliseconds(200));

    await client.Emit("stop typing");

    await Task.Delay(TimeSpan.FromSeconds(2));

    await client.DisconnectAsync();
}

它还支持命名空间:

// Will be sent with all messages(Unless otherwise stated).
// Also automatically connects to it.
client.DefaultNamespace = "my";

// or

// Connects to "my" namespace.
await client.ConnectAsync(new Uri(LocalCharServerUrl), cancellationToken, "my");
// Sends message to "my" namespace.
await client.Emit("message", "hello", "my", cancellationToken);

【讨论】:

  • 你能说明你是如何连接的吗?我在连接到使用命名空间和路径的 Paymium api 时运气不佳
  • 用命名空间使用示例更新了我的答案。
【解决方案4】:

好吧,我找到了另一个与 socket.io 配合得很好的 .Net 库。它也是最新的。请点击以下链接,

Quobject/SocketIoClientDotNet

using Quobject.SocketIoClientDotNet.Client;

var socket = IO.Socket("http://localhost");
socket.On(Socket.EVENT_CONNECT, () =>
{
    socket.Emit("hi");
});

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

希望,它可以帮助某人。

【讨论】:

  • 此库现已弃用。
【解决方案5】:

我尝试了以上所有方法,但不知何故他们没有与我正在集成的服务交谈(也许服务被窃听,我不知道是哪个)。所以我自己写了。

https://github.com/it9gamelog/socketio-with-ws-client

简约的单文件客户端实现。由于 socket-io 是一项垂死的技术,而且规范相当复杂,因此任何一方的错误都可能永远无法修复。单个文件方法至少更容易调整、扩展和调试。

【讨论】:

    【解决方案6】:

    这取决于您的网络服务器的外观。在某些情况下,也可能适用于为常规套接字创建侦听器。
    否则,您可能必须创建自己的客户端。但是,您可能只需要实现 WebSocket 传输,因此无论如何它应该相当简单。

    我建议看看问题“Is there a WebSocket client implemented for .NET?”和my (fairly simple) WebSocket Socket.IO transport client implementation for Java

    【讨论】:

    • 理想情况下,我正在寻找用 c# 编写的 socket.io 客户端的包装器。我可以写一个socket webserver,问题是socket.io协议。
    • @Dested,那我建议看看我提供的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2011-08-18
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多